• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            興海北路

            ---男兒仗劍自橫行
            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統(tǒng)計(jì)

            • 隨筆 - 85
            • 文章 - 0
            • 評(píng)論 - 17
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類

            隨筆檔案

            收藏夾

            全是知識(shí)啊

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            linux shell編程學(xué)習(xí)筆記
            作者: falcon   發(fā)表日期: 2006-04-03 18:32   復(fù)制鏈接



            這里只是我自己的個(gè)人學(xué)習(xí)筆記哦,要是想系統(tǒng)的學(xué)shell,應(yīng)該找一些比較系統(tǒng)的資料
            這里有一篇好的:http://www.chinaunix.net/jh/24/628472.html

            shell概述、Shell變量、位置參數(shù)、特殊符號(hào)、別名、各種控制語(yǔ)句、函數(shù)等Shell編程知識(shí)

            執(zhí)行Shell腳本的方式

            1)輸入重定向到bash: bash <exl
            可以讀入exl中的程序,并執(zhí)行
            2)以腳本名作為參數(shù)
            其一般形式是:
            $ bash 腳本名 [參數(shù)]
            例如:
            $ bash ex2   /usr/meng   /usr/zhang
            其執(zhí)行過(guò)程與上一種方式一樣,但這種方式的好處是能在腳本名后面帶有參數(shù),從而將參數(shù)值傳遞給程序中的命令,使一個(gè)Shell腳本可以處理多種情況,就如同函數(shù)調(diào)用時(shí)可根據(jù)具體問(wèn)題給定相應(yīng)的實(shí)參。
            如果以目前Shell(以·表示)執(zhí)行一個(gè)Shell腳本,則可以使用如下簡(jiǎn)便形式:
            $ · 腳本名 [參數(shù)]
            以Shell腳本作為Shell的命令行參數(shù),這種方式可用來(lái)進(jìn)行程序調(diào)試。
            3)將Shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。
            具體辦法:chmod 777 腳本名

            Shell的執(zhí)行原理
            Shell 接收用戶輸入的命令(腳本名),并進(jìn)行分析。如果文件被標(biāo)記為可執(zhí)行的,但不是被編譯過(guò)的程序,Shell就認(rèn)為它是一個(gè)Shell腳本。Shell將讀 取其中的內(nèi)容,并加以解釋執(zhí)行。所以,從用戶的觀點(diǎn)看,執(zhí)行Shell腳本的方式與執(zhí)行一般的可執(zhí)行文件的方式相似。
            因此,用戶開發(fā)的Shell腳本可以駐留在命令搜索路徑的目錄之下(通常是“/bin”、 “/usr/bin”等),像普通命令一樣使用。這樣,也就開發(fā)出自己的新命令。如果打算反復(fù)使用編好的Shell腳本,那么采用這種方式就比較方便。


            變量賦值

            可以將一個(gè)命令的執(zhí)行結(jié)果賦值給變量。有兩種形式的命令替換:一種是使用倒引號(hào)引用命令,其一般形式是: `命令表`。
            例如:將當(dāng)前工作目錄的全路徑名存放到變量dir中,輸入以下命令行:
            $ dir=`pwd`
            另一種形式是:$(命令表)。上面的命令行也可以改寫為:
            $ dir=$(pwd)


            數(shù)組

            bash只提供一維數(shù)組,并且沒(méi)有限定數(shù)組的大小。類似與C語(yǔ)言,數(shù)組元素的下標(biāo)由0開始編號(hào)。獲取數(shù)組中的元素要利用下標(biāo)。下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于0。用戶可以使用賦值語(yǔ)句對(duì)數(shù)組變量賦值。對(duì)數(shù)組元素賦值的一般形式是:數(shù)組名[下標(biāo)]=值例如:
            $ city[0]=Beijing
            $ city[1]=Shanghai
            $ city[2]=Tianjin
            $
            也可以用declare命令顯式聲明一個(gè)數(shù)組,一般形式是:
            declare -a 數(shù)組名
            讀取數(shù)組元素值的一般格式是:
            ${數(shù)組名[下標(biāo)]}
            例如:
            $ echo ${city[0]}
            Beijing
            一個(gè)數(shù)組的各個(gè)元素可以利用上述方式一個(gè)元素一個(gè)元素地賦值,也可以組合賦值。定義一個(gè)數(shù)組并為其賦初值的一般形式是:
            數(shù)組名=(值1 值2 ... 值n)
            其中,各個(gè)值之間以空格分開。
            例如:
            $ A=(this is an example of shell script)
            $ echo ${A[0]} ${A[2]} ${A[3]} ${A[6]}
            this an example script
            $ echo ${A[8]}
            $
            由于值表中初值共有7個(gè),所以A的元素個(gè)數(shù)也是7。A[8]超出了已賦值的數(shù)組A的范圍,就認(rèn)為它是一個(gè)新元素,由于預(yù)先沒(méi)有賦值,所以它的值是空串。
            若沒(méi)有給出數(shù)組元素的下標(biāo),則數(shù)組名表示下標(biāo)為0的數(shù)組元素,如city就等價(jià)于city[0]。
            使用*或@做下標(biāo),則會(huì)以數(shù)組中所有元素取代 或[@]。

            2006.8.19
            最近在寫一個(gè)拆分字符串的代碼的時(shí)候用到了數(shù)組,我把實(shí)例寫一下
            問(wèn)題大概是這個(gè)樣子:我需要把一個(gè)存放有ip段的字符分開,分成開始地址和結(jié)束地址。
            下面是解決辦法


            Code:

            [Ctrl+A Select All]




            參數(shù)傳遞

            假如我要編寫一個(gè)shell來(lái)求兩個(gè)數(shù)的和,可以怎么實(shí)現(xiàn)呢?
            為了介紹參數(shù)傳遞的使用
            我們用vi add編寫一個(gè)這樣的腳本:

            let sum=$1+$2
            echo $sum

            保存后,我們執(zhí)行一下:
            #./add 5 10
            15

            可以看出5和10分別傳給了$1和$2
            其實(shí)這是shell自己某人的參數(shù)順序,其實(shí)我們可以自己先定義好變量,然后傳遞進(jìn)去

            例如:
            我們先修改上面的add文件:

            let sum=$X+$Y
            echo $sum

            現(xiàn)在我們,這樣執(zhí)行
            #X=5 Y=10 ./add
            15

            我們同樣可以得到正確結(jié)果哦

            設(shè)置環(huán)境變量

            將shell程序的變量輸出到環(huán)境變量export

            #opid=True
            #export=opid

            這樣子就可以拉
            不過(guò)還可以直接到/etc/profile里頭去添加哦
            具體操作類似
            在里頭的export命令之前先增加
            opid=True
            然后在export命令后面增加opid項(xiàng)

            鍵盤讀起變量值

            我們可以通過(guò)read來(lái)讀取變量值哦
            下面我們來(lái)等待用戶輸入一個(gè)值并且顯示出來(lái)

            Quote:

            falcon@falcon:~$ read -p "請(qǐng)輸入一個(gè)值 : "  input ; echo "你輸入了一個(gè)值為 :" $input
            請(qǐng)輸入一個(gè)值 : 21500
            你輸入了一個(gè)值為 : 21500



            設(shè)置變量的只讀屬性

            有些重要的shell變量,賦值后不應(yīng)該修改,那么我們可設(shè)置他為readonly
            具體操作:
            #oracle_home=/usr/oracle7/bin
            #readonly oracle_home

            條件測(cè)試命令test
            語(yǔ)法:test 表達(dá)式
            如果表達(dá)式為真,則返回真,否則,返回假

            1)數(shù)值比較
            先給出數(shù)值比較時(shí)常見(jiàn)的比較符:
            -eg   =
            -ne   !=
            -gt >
            -ge >=
            -lt <
            -le <=

            #test var1 -gt var2

            2)文件屬性
            文件的可讀、可寫、可執(zhí)行,是否為普通文件,是否為目錄分別對(duì)應(yīng)
                -r   -w   -x     -f         -d

            #test -r filename

            3)字符傳屬性以及比較

            串的長(zhǎng)度為零:-z 非零:-n

            如:
            #test -z s1  
            如果串s1長(zhǎng)度為零,返回真

            串比較:相等s1=s2 不相等 s1!=s2
            我們還有一種比較串的方法(可以按字典序來(lái)比較哦):

            Quote:

            falcon@falcon:~$ if [[ 'abcde' <'abcdf' ]]; then  echo "yeah,果然是誒"; fi
            yeah,果然是誒


            整數(shù)算術(shù)或關(guān)系運(yùn)算expr
            可用該命令進(jìn)行的運(yùn)算有
            算術(shù)運(yùn)算:+ - * / %
            邏輯運(yùn)算:= ! < <= > >=

            如:
            #i=5;expr $i+5

            另外,bc是linux下的一個(gè)計(jì)算器,可以進(jìn)行一些算術(shù)計(jì)算

            控制執(zhí)行流程命令

            (1)條件分支命令if ,case

            if命令舉例:

            下面的shell作用:判斷輸入的第一個(gè)參數(shù)的值是一個(gè)普通文件名,那么分頁(yè)打印該文件;否則,判斷它是否為目錄名,若是則進(jìn)入該目錄并打印該目錄下的所有文件,如果也不是目錄名,那么提示相關(guān)信息。

            if test -f $1
            then
                          pr $1>/dev/lp0
            elif
                          test-d $1
            then
                          (cd $1;pr *>/dev/lp0)
            else
                            echo $1 is neither a file nor a directory
            fi

            case命令舉例:

            case命令是一個(gè)基于模式匹配的多路分之命令
            下面的shell將根據(jù)用戶鍵盤輸入情況決定下一步將執(zhí)行那一組命令。

            while [ $reply!="y" ] && [ $reply!="Y" ]                         #下面將學(xué)習(xí)的循環(huán)語(yǔ)句
            do
                    echo "\nAre you want to continue?(Y/N)\c"
                    read reply             #讀取鍵盤
                    case $replay in
                          (y|Y) break;;         #退出循環(huán)
                          (n|N) echo "\n\nTerminating\n"
                                  exit 0;;
                                *) echo "\n\nPlease answer y or n"
                                    continue;       #直接返回內(nèi)層循環(huán)開始出繼續(xù)
                    esac
            done

            (2)循環(huán)語(yǔ)句

            條件循環(huán)語(yǔ)句while,until
            語(yǔ)法:
            while/until 命令表1
            do
                  命令表2
            done

            區(qū)別是,前者在執(zhí)行完命令表1后,如果出口狀態(tài)為零,那么執(zhí)行do后面的命令表2,然后回到起始處,而后者執(zhí)行命令表1后,如果出口狀態(tài)非零,才執(zhí)行類似操作。
            [例子同上]

            有限循環(huán)命令for
            語(yǔ)法:
            for 變量名 in 字符串表
            do
                命令表
            done
            舉例:
            FILE="test1.c myfile1.f pccn.h"
            for i in $FILE
            do
                  cd ./tmp
                  cp $i $i.old
                  echo "$i copied"
            done


            函數(shù)

            先在我們來(lái)看看shell里頭的函數(shù)怎么用

            先看個(gè)例子:我們些一個(gè)函數(shù),然后調(diào)用它顯示"Hello,World!"
            #函數(shù)定義
            function show
            {
                echo $1$2;
            }
            H="Hello,"
            W="World!"
            show $H $W

            保存為show
            修改執(zhí)行權(quán)限chmod 770 show
            執(zhí)行:
            $./show
            Hello,World!

            呵呵,看出什么蹊蹺了嗎?
            show $H $W
            我們可以通過(guò)直接在函數(shù)明后面跟實(shí)參哦
            實(shí)參順序?qū)?yīng)“虛參”的$1,$2,$3..........

            注意一個(gè)地方哦,假如我要傳進(jìn)去一個(gè)參數(shù),這個(gè)參數(shù)中間帶空格,怎么辦呢?
            你先試試看

            我們來(lái)顯示"Hello World"(兩個(gè)單詞之間有個(gè)空格哦)

            function show
            {
            echo $1
            }
            HW="Hello World"
            show "$HW"

            看看,是不是ok拉,如果你 直接show $HW
            肯定是不行的,因?yàn)?1只接受到了Hello,所以結(jié)果之顯示Hello
            原因是字符串變量必須用"包含起來(lái)

            感興趣的你繼續(xù)學(xué)習(xí)哦!
            還有好多強(qiáng)大的東西值得你去學(xué)習(xí)呢,呵呵,比如cut, expr, sed, awk等等。

            posted on 2008-03-14 15:56 隨意門 閱讀(657) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            午夜精品久久久久久久无码| 久久精品国产亚洲Aⅴ蜜臀色欲| 精品国产乱码久久久久久人妻 | 9191精品国产免费久久| 18岁日韩内射颜射午夜久久成人 | 久久久久亚洲Av无码专| 国产AV影片久久久久久| 久久亚洲中文字幕精品一区| 99久久精品国产高清一区二区 | 久久97精品久久久久久久不卡| 久久综合精品国产一区二区三区 | 久久不见久久见免费视频7| 嫩草影院久久99| 亚洲午夜久久久久久久久电影网| 久久久青草久久久青草| 东方aⅴ免费观看久久av| 精品水蜜桃久久久久久久| 久久精品国产亚洲AV无码偷窥| 亚洲成av人片不卡无码久久| 91久久精品无码一区二区毛片| 久久人妻少妇嫩草AV无码专区| 亚洲人AV永久一区二区三区久久| 2020最新久久久视精品爱| 精品久久久久久国产| 久久人妻少妇嫩草AV无码专区| 精品多毛少妇人妻AV免费久久| 青草久久久国产线免观| 久久99热这里只有精品国产| 欧美久久综合性欧美| 久久91精品国产91久久户| 精品久久久久久久无码| 精品人妻久久久久久888| 亚洲国产精品无码久久久不卡| 久久久高清免费视频| 无码人妻久久一区二区三区蜜桃| 久久青青草原综合伊人| 99久久精品午夜一区二区| 国产精品99久久99久久久| 国产麻豆精品久久一二三| 久久精品国产精品青草app| 精品精品国产自在久久高清|