shell script詳解

shell script詳解

定義

         利用shell的功能寫的一個「程序」(program),這個程序是純文本文件,能夠將一些shell的語法與命令(含外部命令)寫在裏面,搭配正則表達式、管道命令與數據流重定向。node

用途

         自動化管理、管理系統、入侵檢測、連續命令單一化、簡單的數據處理、跨平臺使用等正則表達式

規範

        #!/bin/bashshell

        聲明這個文件內的語法是bash的語法,則系統會加載bash的相關配置文件來執行下面的命令bash

        # Program:less

        #       This program shows "Hello world" in your screen.測試

        # History:spa

        # 2017/06/25    yc      First release調試

        說明該script的內容與功能、版本信息等blog

        PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin進程

        export PATH

        設置一些重要的環境變量,如PATH、LANG

        ......

        主要的程序內容

        exit 0

        告知腳本的執行結果$?,可用來定製錯誤信息

執行方式

直接執行 或 bash進程執行

         絕對路徑執行/相對路徑執行/變量PATH中執行

         ./sh02.sh

         該腳本在子進程的bash內執行。當子進程完成後,子進程內的各項變量或操做將會結束,而不會傳回到父進程中

        

source 或 . 執行

         source sh02.sh || . sh02.sh

         該腳本在父進程中執行。

        

邏輯運算

         total=$(( $firstnu * $secnu ))

         echo $(( 13 % 3 ))

判斷式

使用

         test -e filename

         [ "VBird Tsai" == "Vbird" ]        # 空格必須

大全

  測試的標誌   表明意義

  1. 關於某個文件名的『文件類型』判斷,如 test -e filename 表示存在否

    -e     該『文件名』是否存在?(經常使用)

    -f      該『文件名』是否存在且爲文件(file)?(經常使用)

    -d     該『文件名』是否存在且爲目錄(directory)?(經常使用)

    -b     該『文件名』是否存在且爲一個 block device 裝置?

    -c      該『文件名』是否存在且爲一個 character device 裝置?

    -S      該『文件名』是否存在且爲一個 Socket 文件?

    -p     該『文件名』是否存在且爲一個 FIFO (pipe) 文件?

    -L      該『文件名』是否存在且爲一個連結文件?

   2. 關於文件的權限檢測,如 test -r filename 表示可讀否 (但 root 權限常有例外)

    -r      檢測該文件名是否存在且具備『可讀』的權限?

    -w    檢測該文件名是否存在且具備『可寫』的權限?

    -x      檢測該文件名是否存在且具備『可執行』的權限?

    -u     檢測該文件名是否存在且具備『SUID』的屬性?

    -g     檢測該文件名是否存在且具備『SGID』的屬性?

    -k      檢測該文件名是否存在且具備『Sticky bit』的屬性?

    -s      檢測該文件名是否存在且爲『非空白文件』?

  3. 兩個文件之間的比較,如: test file1 -nt file2

    -nt    (newer than)判斷 file1 是否比 file2 新

    -ot    (older than)判斷 file1 是否比 file2 舊

    -ef    判斷 file1 不 file2 是否爲同一文件,可用在判斷 hard link 的斷定上。 主要意義在斷定,兩個文件是否均指向同一個 inode !

  4. 關於兩個整數之間的斷定,例如 test n1 -eq n2

    -eq   兩數值相等 (equal)

    -ne   兩數值不等 (not equal)

    -gt    n1 大於 n2 (greater than)

    -lt     n1 小於 n2 (less than)

    -ge   n1 大於等於 n2 (greater than or equal)

    -le    n1 小於等於 n2 (less than or equal)

  5. 斷定字符串的數據

    test -z string             斷定字符串是否爲 0 ?若 string 爲空字符串,則爲 true

    test -n string             斷定字符串是否非爲 0 ?若 string 爲空字符串,則爲 false。注: -n 亦可省略

    test str1 = str2         斷定 str1 是否等於 str2 ,若相等,則回傳 true

    test str1 != str2       斷定 str1 是否不等於 str2 ,若相等,則回傳 false

  6. 多條件斷定,例如: test -r filename -a -x filename

    -a     (and)兩情況同時成立!例如 test -r file -a -x file,則 file 同時具備 r 不 x 權限時,纔回傳 true。

    -o     (or)兩情況任何一個成立!例如 test -r file -o -x file,則 file 具備 r 或 x 權限時,就可回傳 true。

    !       反相狀態,如 test ! -x file ,當 file 不具備 x 時,回傳 true

shell script的默認變量

         $0              執行的腳本文件名

         $一、$2...          第一個接的參數是$一、第二個接的參數是$2 ...

         $#     該腳本有多少個後接參數

         $@   表明"$1"、"$2"、"$3" ...,每一個變量都是獨立的

         $*     表明"$1 $2 $3 ..."

         shift          變量偏移

                   shift

                            偏移一個變量,本來的$2變爲$1,$3變爲$2 ...

                   shift 3

                            偏移三個變量,本來的$4變爲$1,$5變爲$2 ...

條件判斷式

  # if ... else ... fi

           if [ 條件1 ] && [ 條件2 ]; then

                     動做1

           elif [ 條件3 ]; then

                     動做2

           else

                     動做3

           fi

  # case ... esac

           case $變量名稱 in

                     "第1個變量內容")

                              動做1

                              ;;

                     "第2個變量內容")

                              動做2

                              ;;

                     ...

                     *)

                              上面的狀況都不符合的動做n

                              ;;

           esac

  # function

           # 注:function必須寫到程序的最前面

           # 注:function中也能夠用$一、$2 ...等,參數不在()中寫

           function fname() {

                     程序段

           }

循環

  # while...do...done

  條件成立,執行程序段

           while [ 條件 ]

           do

                     程序段

           done

  # until...do...done

  條件成立,終止程序段

           until [ 條件 ]

           do

                     程序段

           done

  # for (;;) do...done

           for (( i=1;i<=$nu;i=i+1))

      do

      程序段

      done

  # for (in) do...done

           1 分隔命令

  users=$(cut -d ':' -f 1 /etc/passwd)

                     for username in $users

           2 seq獲取連續值

                     for sitenu in $(seq 1 100)

           3 ls得到目錄下文件

                     for file in $(ls $dir)

交互式

  # read

    read基本使用1

    read基本使用2

shell script的追蹤與調試

         sh [-nvx] script.sh

                   n       不執行script,僅查詢語法的問題,無問題無輸出

                   v       在執行script前,先將script的內容輸出到屏幕上

                   x       將是用到的script內容顯示到屏幕上

相關文章
相關標籤/搜索