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

            鏈接

            最新隨筆

            搜索

            最新評論

            久久久久人妻一区二区三区| 久久伊人精品青青草原日本| 日产精品久久久久久久性色| 亚洲日本va中文字幕久久| 国内精品综合久久久40p| 国产精品久久久久9999| 日韩久久无码免费毛片软件| 久久天天躁狠狠躁夜夜avapp| 久久这里只有精品久久| 久久AV高潮AV无码AV| 中文精品久久久久国产网址| 久久无码中文字幕东京热| 丁香五月综合久久激情| 亚洲精品无码成人片久久| 精品乱码久久久久久夜夜嗨| 久久久久久亚洲AV无码专区| 久久久久亚洲AV无码去区首| 久久久久久久99精品免费观看| 97视频久久久| 亚洲乱码日产精品a级毛片久久| 国产精品久久久福利| 久久久久亚洲AV成人片| 国产成人精品综合久久久| 人妻中文久久久久| 久久精品国产99久久香蕉| 94久久国产乱子伦精品免费| 91精品国产乱码久久久久久| A级毛片无码久久精品免费| 欧美午夜A∨大片久久 | 欧美日韩精品久久久免费观看| 伊人热人久久中文字幕| 久久香蕉一级毛片| 91精品国产9l久久久久| 2021精品国产综合久久| 久久国产精品-久久精品| 99久久精品午夜一区二区| aaa级精品久久久国产片| 久久狠狠色狠狠色综合| 免费观看久久精彩视频| 国产精品久久久天天影视香蕉 | 亚洲综合久久综合激情久久|