• <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>

            天下

            記錄修行的印記

            shell編程筆記

            腳本不是復(fù)雜的程序,它是按行解釋的,腳本的第一行總是以#!/bin/sh開始.
            這行代碼通知書shell使用系統(tǒng)上的Bourne shell解析器.

            shell語法
            test 命令
            1.條件測試
            test命令用于測試字符串
            ,文件狀態(tài)和數(shù)字.

            工作原理
            test 命令最短的定義可能是評估一個表達(dá)式;如果條件為真,則返回一個 
            0 值。如果表達(dá)式不為真,返回非0

            test一般有兩種格式
            :

            test 條件表達(dá)式

            [ 條件表達(dá)式 ]

            使用方括號時
            ,要注意在條件兩邊加上空格.

            文件運算符
            利用這些運算符,您可以在程序中根據(jù)對文件類型的評估結(jié)果執(zhí)行不同的操作:
            -b file 如果文件為一個塊特殊文件,則為真
            -c file 如果文件為一個字符特殊文件,則為真
            -d file 如果文件為一個目錄,則為真
            -e file 如果文件存在,則為真
            -f file 如果文件為一個普通文件,則為真
            -g file 如果設(shè)置了文件的 SGID 位,則為真
            -G file 如果文件存在且歸該組所有,則為真
            -k file 如果設(shè)置了文件的粘著位,則為真
            -O file 如果文件存在并且歸該用戶所有,則為真
            -p file 如果文件為一個命名管道,則為真
            -r file 如果文件可讀,則為真
            -s file 如果文件的長度不為零,則為真
            -S file 如果文件為一個套接字特殊文件,則為真
            -t fd    如果 fd 是一個與終端相連的打開的文件描述符(fd 默認(rèn)為 1),則為真
            -u file 如果設(shè)置了文件的 SUID 位,則為真
            -w file 如果文件可寫,則為真
            -x file 如果文件可執(zhí)行,則為真

            字符串比較運算符
            如標(biāo)題所示,這組函數(shù)比較字符串的值。您可以檢查它們是否存在、是否相同或者是否不同。
            string 測試以判斷字符串是否不為空
            -n string 測試以判斷字符串是否不為空;
            -z string 測試以判斷字符串是否為空;
            string1 
            = string2 測試以判斷 string1 是否與 string2 相同
            string1 
            != string2 測試以判斷 string1 是否與 string2 不同

            整數(shù)比較運算符
            正如字符串比較運算符驗證字符串相等或不同一樣,整數(shù)比較運算符對數(shù)字執(zhí)行相同的功能。
            如果變量的值匹配則表達(dá)式測試為真,如果不匹配,則為假。整數(shù)比較運算符不處理字符串(正如字符串運算符不處理數(shù)字一樣):
            -eq    等于
            -ge    大于或等于
            -gt    大于
            -le    小于或等于
            -lt    小于
            -ne    不等于
            :
            # [ 2 -gt 3 ]
            # echo $?

            1

            # [ 2 -lt 3 ]
            # echo $?

            0

            布爾運算符
            布爾運算符在幾乎每種語言中的工作方式都相同 — 包括 shell 腳本。在 nutshell 中,它們檢查多個條件為真或為假,或者針對假的條件而不是真的條件采取操作。與 test 搭配使用的運算符有
            :
            !    條件非
            -a    條件與
            -o    條件或



            控制結(jié)構(gòu)
            無論什么編程語言都離不開條件判斷。SHELL也不例外。
            條件分支

            if語句

            語法1
            :
            if 條件表達(dá)式
                then    命令
            fi

            語法2
            :
            if 條件表達(dá)式; then
                
            do something here
            elif 條件表達(dá)式 then
                
            do another thing here
            else
                
            do something else here
            fi

            使用if時
            ,必須將then部分放在新行,否則會報錯.
            如果要不分行
            ,必須使用命令分隔符.
            $ vi testsh.sh
            #!/bin/sh
            if
            cat 111-tmp.txt | grep ting1
            then
            echo found
            else
            echo "no found"
            fi

            $ vi testsh.sh
            #!/bin/sh
            cat 111-tmp.txt | grep ting1
            if [ $? -eq 0 ]
            then
            echo $?
            echo found
            else
            echo $?
            echo "no found"
            fi

            #!/bin/sh

            #函數(shù)
            gw()
            {
            echo "do function gw()"
            return 0
            }

            if gw
            then
                    echo "run succeed"
                    echo "run succeed"
            else
                    echo "run failed"
                    echo "run failed"
            fi

            說明:
            if 命令/函數(shù) 0為真,走then
            if 多條指令,這些命令之間相當(dāng)于“and”(與)



            case語句
            case命令可類比C語言的switch
            /case語句,esac表示case語句塊的結(jié)束。
            每個匹配分支可以有若干條命令,末尾必須以;;結(jié)束,執(zhí)行時找到第一個匹配的分支并執(zhí)行相應(yīng)的命令,然后直接跳到esac之后,不需要像C語言一樣用break跳出。
            :
            #! /bin/sh
            echo "Is it morning? Please answer yes or no."
            read YES_OR_NO
            case 
            "$YES_OR_NO" in
            yes
            |y|Yes|YES)
              echo 
            "Good Morning!";;
            [nN]
            *)
              echo 
            "Good Afternoon!";;
            *)
              echo 
            "Sorry, $YES_OR_NO not recognized. Enter yes or no."
              
            exit 1;;
            esac
            exit 0


            for語句
            for 變量名 in 列表
            do
                命令1
                命令2
            done

            Shell腳本的for循環(huán)結(jié)構(gòu)和C語言很不一樣,它類似php編程語言的foreach循環(huán)。例如:
            #!/bin/sh
            for FRUIT in apple banana pear; do
              echo 
            "I like $FRUIT"
            done

            while/do/done
            while的用法和C語言類似。比如一個驗證密碼的腳本:

            #!/bin/sh
            echo "Enter password:"
            read TRY
            while [ "$TRY" != "secret" ]; do
              echo 
            "Sorry, try again"
              
            read TRY
            done


            位置參數(shù)和特殊變量
            $
            0    相當(dāng)于C語言main函數(shù)的argv[0]
            $
            1、$2    這些稱為位置參數(shù)(Positional Parameter),相當(dāng)于C語言main函數(shù)的argv[1]、argv[2]
            $
            #    參數(shù)個數(shù),不包括程序自身,相當(dāng)于C語言main函數(shù)的argc-1
            $@    表示參數(shù)列表"$1" "$2" ,例如可以用在for循環(huán)中的in后面。
            $
            ?    上一條命令的Exit Status
            $$    當(dāng)前Shell的進(jìn)程號

            位置參數(shù)可以用shift命令左移。
            比如shift 3表示原來的$4現(xiàn)在變成$
            1,原來的$5現(xiàn)在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。不帶參數(shù)的shift命令相當(dāng)于shift 1


            函數(shù)

            和C語言類似,Shell中也有函數(shù)的概念,但是函數(shù)定義中沒有返回值也沒有參數(shù)列表。例如:

            #!/bin/sh

            foo(){ echo 
            "Function foo is called";}
            echo 
            "-=start=-"
            foo
            echo 
            "-=end=-"

            注意函數(shù)體的左花括號{和后面的命令之間必須有空格或換行,如果將最后一條命令和右花括號}寫在同一行,命令末尾必須有;號。

            在定義foo()函數(shù)時并不執(zhí)行函數(shù)體中的命令,就像定義變量一樣,只是給foo這個名字一個定義,到后面調(diào)用foo函數(shù)的時候(注意Shell中的函數(shù)調(diào)用不寫括號)才執(zhí)行函數(shù)體中的命令。Shell腳本中的函數(shù)必須先定義后調(diào)用,一般把函數(shù)定義都寫在腳本的前面,把函數(shù)調(diào)用和其它命令寫在腳本的最后(類似C語言中的main函數(shù),這才是整個腳本實際開始執(zhí)行命令的地方)。

            Shell函數(shù)沒有參數(shù)列表并不表示不能傳參數(shù),事實上,函數(shù)就像是迷你腳本,調(diào)用函數(shù)時可以傳任意個參數(shù),在函數(shù)內(nèi)同樣是用$
            0、$1、$2等變量來提取參數(shù),函數(shù)中的位置參數(shù)相當(dāng)于函數(shù)的局部變量,改變這些變量并不會影響函數(shù)外面的$0、$1、$2等變量。函數(shù)中可以用return命令返回,如果return后面跟一個數(shù)字則表示函數(shù)的Exit Status。

            until語句
              until循環(huán)執(zhí)行一系列命令直至條件為真時停止。注意
            ,這里是直到條件是真時才停止
            until格式為:
            until 條件
              命令1
              

            done


            i
            =0
            until [ $i -gt 3 ]
            do
                i
            =`expr "$i" + 1`
                
            #i=$(($i + 1))
                echo $i
            done

            posted on 2011-09-08 15:54 天下 閱讀(499) 評論(0)  編輯 收藏 引用 所屬分類: Linux使用Linux編程Linux Shell

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            久久婷婷五月综合97色直播| 影音先锋女人AV鲁色资源网久久| 国内精品久久久久久久97牛牛| 久久久久亚洲AV无码永不| 久久精品人人做人人爽电影蜜月 | 99蜜桃臀久久久欧美精品网站| 亚洲国产成人精品无码久久久久久综合| 日韩电影久久久被窝网| 久久婷婷五月综合国产尤物app| 伊人色综合久久| 人妻无码久久一区二区三区免费| 亚洲国产二区三区久久| 久久这里只有精品首页| 国内精品久久久久久久影视麻豆| 久久精品国产日本波多野结衣| 99久久国产主播综合精品| 亚洲va久久久噜噜噜久久男同| 久久精品国产一区二区电影| 九九精品99久久久香蕉| 久久久久久久久久久| 久久福利片| 99久久婷婷国产综合精品草原 | 久久99精品久久只有精品| 久久精品中文字幕有码| 久久99精品久久久久久动态图| 一级a性色生活片久久无少妇一级婬片免费放| 人人狠狠综合久久88成人| 久久99久国产麻精品66| 亚洲欧美日韩精品久久亚洲区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 伊人伊成久久人综合网777| 久久精品国产精品亚洲| 国产激情久久久久影院小草 | 久久久噜噜噜www成人网| 久久天天婷婷五月俺也去| 午夜精品久久久久久久无码| 亚州日韩精品专区久久久| 亚洲欧美成人久久综合中文网| 性做久久久久久久久老女人| 久久久这里有精品中文字幕| 色婷婷综合久久久久中文字幕|