Linux Shell腳本

shell是用C語言編寫的程序,爲用戶與Linux之間的橋樑。可是,本篇文章中的shell是指shell腳本語言。java

話很少說,先上個例子。腳本 test.sh 以下:shell

#!/bin/bash
#打印出Hello,World
echo "Hello,World"

說明1. #! 是一個約定的標記,用來告訴系統該腳本須要什麼解釋器來執行,如 #!/bin/sh   #!/bin/bash數組

說明2. 第二行是註釋,shell中的註釋使用 #bash

執行shell腳本的兩種方法:數據結構

  1. 可執行程序函數

    chmod  +x  ./test.sh  #使腳本具備執行權限測試

    ./test.sh  #執行腳本spa

  2. 做爲解釋器參數執行unix

    /bin/sh  test.sh  (能夠簡寫爲 sh  test.sh)code

 

2、shell變量

2.1 shell變量命名規則

  1)只能用英文字母、數字和下劃線,且首字母不能以數字開頭;

  2)中間不能有空格、標點符號等其餘符號;

  3)不能使用bash的保留關鍵字

2.2 shell變量定義和使用

  定義語法:  varname=值

    注意: =號先後不能有空格

  使用變量語法: $varname

    也可使用 ${varname}  , {} 爲可選項,界定變量名邊界

2.3 只讀變量

  使用 readonly 命令修飾的變量,值不可變,稱只讀變量。如

    readonly  varname="test.sh"

2.4 刪除變量

  使用 unset 命令能夠刪除非只讀變量。如

    varname=11

    unset  varname

2.5 shell中同時存在三種變量

  1) 局部變量

  2)環境變量

  3)shell變量

 

3、shell中數據結構

3.1 字符串

  1)可使用單引號、雙引號,也能夠不使用引號

    單引號:1.包含的字符串會原樣輸出;2.包含的字符串不能出現單獨一個單引號

    雙引號:1.包含的字符串能夠出現變量;2.能夠有轉義符

  2)定義一個字符串: str=abcd

  3)獲取字符串的長度:  ${#str}

  4)提取子字符串: ${#str:first:length}   #從first位置起截取length長度的字符串

  5)查找子字符串: `expr  index  "$str"  io`  #使用反引號`

3.2 shell數組

  shell只支持一維數組,而且不限定數組的大小,數組的下標是從0開始的,下標能夠是整數或算術表達式,其值應該大於或者等於0.

  1)數組的定義: shell中使用括號()定義數組,元素之間用「空格」分隔,語法以下

    array_name=(value0  value1  value2 .........  valueN)

    也可使用下標來定義:  array_name[下標]=value

  2)讀取數組 語法:   ${array_name[下標]}    #下標爲@或者*表示全部元素

  3)獲取數組長度: 與獲取字符串長度的方法相同

    獲取數組元素個數:  ${#array_name[@]}  或者  ${#array_name[*]}

    獲取單個元素的長度: ${#array_name[下標]}

4、shell註釋

  單行註釋:  #

  多行註釋:  :<<EOF

          .........

          .........

        EOF

      或者

       :<<!

        ...............

        ...............

      !

5、shell基本運算符

  包括 算數運算符、關係運算符、布爾運算符、字符串運算符、文件測試運算符。

5.1 算數運算符

  原生Bash不支持簡單的數字運算,但可使用其餘命令實現,如awk和expr,其中expr最經常使用

  例如: val=`expr 2 + 2`

    注意1:表達式和運算符之間必須有空格;

    注意2:必須使用``(反引號)包含

  算數運算符及其說明和舉例

    + : 加法, `expr $a + $b`

    - : 減法

    * : 乘法

    / : 除法

    % : 取餘

    = : 賦值, a=$b

    == : 相等, [$a == $b]

    != : 不相等

5.2 關係運算符

  只支持數字和值爲數字的字符串

  關係運算符及其說明和舉例

    -eq : 是否相等, [$a -eq $b]

    -nq : 是否不相等, [$a -nq $b]

    -gt : 大於, [$a -gt $b]

    -lt : 小於, [$a -lt $b]

    -ge : 大於等於, [$a -ge $b]

    -le : 小於等於, [$a -le $b]

5.3 布爾運算符

  布爾運算符及其說明和舉例

    ! : 非, [!false]

    -o : 或,[$a -lt 20 -o $b -gt 100]

    -a : 與,[$a -lt 20 -a $b -gt 100]

5.4 邏輯運算符

  邏輯運算符及其說明和舉例

    && : 邏輯的AND, [[$a -lt 20 && $b -gt 100]]

    || : 邏輯的OR,[[$a -lt 20 || $b -gt 100]]

5.5 字符串運算符

  字符串運算符及其說明和舉例

    = : 是否相等,相等爲true, [ $a = $b ]

    != : 是否不相等,不相等爲true, [ $a != $b ]

    -z : 長度是否爲0,0爲true, [ -z $a ]

    -n : 長度是否爲0,不爲0爲true, [ -n $a ]

        : 是否爲空,不爲空返回true, [ $a ]

5.6 文件測試運算符

  用於檢測unix文件的各類屬性

  文件測試運算符及其說明和舉例

    -b  file : 檢測文件是不是塊設備文件,是返回true, [ -b file ]

    -c  file : 是不是字符設備文件,是返回true

    -d  file : 是不是目錄,是返回true

    -f  file : 是不是普通文件,是返回true

    -g  file : 是否設置了SGID位,是返回true

    -k  file : 是否設置了粘着位(sticky Bit),是返回true

    -p  file : 是不是有名管道,是返回true

    -u  file : 是否設置了SUID位,是返回true

    -r  file : 文件是否可讀,是返回true

    -w  file : 文件是否可寫,是返回true

    -x  file : 文件是否可執行,是返回true

    -s  file : 文件是否爲空,不爲空返回true

    -e  file : 文件(目錄)是否存在,是返回true

5.7 test命令

  用於檢查某個條件是否成立,能夠進行數值、字符和文件三個方面的測試。與上面的「關係運算符」、「字符串運算符」、「文件測試運算符」相同,只是寫法上不一樣。

  test命令寫法以下:

    test  ${num1}  -eq  ${num2}

6、shell打印命令

  shell打印命令有 echo 和 printf

6.1 shell  echo命令

  用於字符串的輸出,格式 : echo str

  顯示普通字符串: echo "It is a test"

  顯示轉移字符: echo "\"It is a test\""

  顯示變量: echo  $str

  開啓轉義: echo  -e  "OK! \n"  #換行

        echo  -e  "OK! \c" #不換行

  單引號'' 與 雙引號"" 的區別

    單引號:原樣輸出;雙引號:變量、轉義符等均生效。

  顯示命令執行結果: echo  `date` #注意是反引號

  echo總結

    名稱 | 可否引用變量 | 可否引用轉義符 | 可否引用文本格式符(換行、製表等符號)

    單引號 | 否 | 否 | 否

    雙引號 | 能 | 能 | 能

    無引號 | 能 | 能 | 否

6.2 printf 命令

  相較於 echo ,printf 具備很好的移植性,可是printf不會自動添加換行符,須要手動添加 \n

  printf命令的語法: printf  format-string  [arguments ......]

    說明1: format-string  格式控制字符串

    說明2: arguments 參數列表

  例如:  printf  "%-10s  %-8s  %-4s \n"  姓名  性別  體重kg

  printf格式替換符: %d   %s   %c   %f

    d : Decimal 十進制整數

    s : String 字符串

    c : char 字符

    f : Float 浮點數

  printf的轉義序列:

    \a : 警告字符;

    \b : 後退

    \c : 

    \f : 換頁

    \n : 換行

    \r : 回車

    \t : 水平製表符

    \v : 垂直製表符

    \\ : 一個字面上的反斜槓字符

    \ddd : 表示 1 到 3 位數八進制值的字符,僅在格式字符串中有效

    \0ddd : 表示 1 到 3 位的八進制值字符

7、read 命令

  read命令從標準輸入中讀取一行,並把輸入行的每一個字段的值指定給shell變量。read命令一個一個詞組地接收輸入的參數,之間用空格分隔,輸入的詞大於須要參數的個數,則最後多餘的會成一個總體

  read 參數說明:

    -p : 輸入提示文字

    -n : 輸入字符長度限制

    -t : 輸入限時

    -s : 隱藏輸入內容

8、shell流程控制

  首先聲明一點,shell控制流中不能爲空。

  8.1 if

    格式:

      if  condition

      then

        command1

        ...........

        commandn

      fi

  8.2 if else

    格式:

      if  condition

      then

        command1

        ..........

        commandn

      else

        command1

        ..........

        commandn

      fi

    8.3 if else-if else

      格式:

        if  condition

        then

          command1

          .........

          commandn

        elif  condition

        then

          command1

          .........

          commandn

        .........

        .........

        else

          command1

          ..........

          commandn

        fi

  8.4 for循環

    格式:

      for  var  in  列表

      do

        command1

        ..........

        commandn

      done

    或者

      for((assignment; condition; next))

      do

        command1

        .........

        commandn

      done

  8.5 while結構

    格式:

      while  condition

      do

        command1

        ...........

        commadn

      done

  8.6 無限循環

    格式:

      while :

      do

        command1

        ..........

        commandn

      done

    或者

      while  true

      do

        command1

        ........

        commandn

      done

    或者

      for((;;))

      do

        command1

        ..........

        commandn

      done

  8.7 until循環

    until循環只有條件爲fasle才執行,條件爲true則終止執行。與while恰好相反。

    格式:

      until  condition

      do

        command1

        ............

        commandn

      done

  8.8 shell中的break 和 continue

    用於退出循環,用法跟java語言中相同。

  8.9 case多選擇語句

    匹配一個值與一個模式,若是匹配成功,執行相匹配的命令

    格式:

      case  值  in

      模式1)

        command1

        ...........

        commandn

      模式2)

        command1

        ...........

        commandn

      ..............

      ..............

      模式n)

        command1

        ...........

        commandn

      *)

        command1

        ...........

        commandn

      esac

9、shell函數

  格式:

    [function]  funname[()]

    {

      astion;

      [return int;]

    }

  注意:1. 調用函數時直接使用函數名 funname;2. return後跟數值;若是沒有顯示return則將最後一條命令的運行結果做爲返回值;3. 調用函數以後,用 $? 來獲取函數返回值;4. 函數調用必須在使用後;5. 可使用函數傳參,函數中獲取參數的方式爲 $n (n >= 1,且n < 10時能夠省去{})。

10、shell傳遞參數

  執行shell腳本或者調用shell函數時,能夠向腳本或者函數傳遞參數。

  在腳本中使用 $n 獲取參數,$n 表示第n個參數,其中 n 爲大於0的整數。

  10.1 特殊參數

    $0 : 所執行腳本的文件名;

    $# : 傳遞到腳本的參數個數;

    $* : 以一個單字符串顯示全部向腳本傳遞的參數;

    $$ : 腳本運行的當前進程ID號;

    $! : 後臺運行的最後一個進程的ID號;

    $@ : 與 $* 相同,可是使用時加引號,並在引號中返回每一個參數;

    $- : 顯示shell使用的當前選項;

    $? : 顯示最後命令的退出狀態,0表示正確退出,其餘值表示錯誤。

  10.2 $* 與 $@ 區別

    相同點: 都是引用全部參數;

    不一樣點: 只有在雙引號中體現出來, * 號: "1 2 3", @: "1" "2" "3"

11、shell輸入/輸出重定向

  標準輸入/標準輸出 : 默認輸入/輸出爲終端

  重定向命令列表以下:

    命令  |  說明

      command  >  filename   |   將輸出重定向到filename

      command  < filename    |    將輸入重定向到fielname

      command  >>  filename   |    將輸出以追加的方式重定向到filename

      n  >  filename   |    將文件描述符爲n的文件重定向到filename

      n  >>   filename   | 將文件描述符爲n的文件以追加的方式重定向到filename   

      n   >&  m   |   將輸出文件m 和 n合併

      n  <&  m    |    將輸入文件m 和 n合併

      << tag     |    將開始標記tag和結束標記tag之間的內容做爲輸入

      n的取值:  0 (標準輸入);  1 (標準輸出);  2 (標準錯誤輸出)

  11.1 Here Document

    shell中的一種特殊的重定向方式,用來將輸入重定向到一個交互式shell腳本或程序

    格式:

      command  <<  delimiter

        document

      delimiter

    做用是將兩個delimiter之間的內容document做爲輸入傳遞給command

    注意:結尾的delimiter先後不能有任意的其餘字符

    例如:

      cat  <<  EOF

        "It is a test"

      EOF

  11.2 /dev/null 文件

    寫入該文件中內容會被丟棄;從該文件中也讀不出任何內容。

12、shell文件包含

  shell能夠包含外部的腳本。

  格式:

    .  filename   #注意點號(.)和文件名中間有一個空格

  或者

    source  filename

  注意:被包含的文件不須要可執行權限。

相關文章
相關標籤/搜索