操作系統知識(7)--Shell(2)

Shell 傳遞參數

我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式爲:$n。n 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推……

實例
以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 爲執行的文件名:

#!/bin/bash

echo "Shell 傳遞參數實例!";
echo "執行的文件名:$0";
echo "第一個參數爲:$1";
echo "第二個參數爲:$2";
echo "第三個參數爲:$3";

爲腳本設置可執行權限,並執行腳本,輸出結果如下所示:
chmod+xtest.sh ./test.sh 1 2 3
Shell 傳遞參數實例!
執行的文件名:test.sh
第一個參數爲:1
第二個參數爲:2
第三個參數爲:3

另外,還有幾個特殊字符用來處理參數:
這裏寫圖片描述

#!/bin/bash

echo "Shell 傳遞參數實例!";
echo "第一個參數爲:$1";

echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";

執行腳本,輸出結果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 傳遞參數實例!
第一個參數爲:1
參數個數爲:3
傳遞的參數作爲一個字符串顯示:1 2 3
$*$a 區別:

  • 相同點:都是引用所有參數。
  • 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 ” * ” 等價於 “1 2 3”(傳遞了一個參數),而 “@” 等價於 “1” “2” “3”(傳遞了三個參數)。
  • #!/bin/bash
    
    echo "-- \$* 演示 ---"
    for i in "$*"; do
        echo $i
    done
    
    echo "-- \$@ 演示 ---"
    for i in "$@"; do
        echo $i
    done

    執行腳本,輸出結果如下所示:

    $ chmod +x test.sh 
    $ ./test.sh 1 2 3
    -- $* 演示 ---
    1 2 3
    -- $@ 演示 ---
    1
    2
    3

    Shell 數組

    數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小(與 PHP 類似)。

    與大部分編程語言類似,數組元素的下標由0開始。

    Shell 數組用括號來表示,元素用”空格”符號分割開,語法格式如下:

    array_name=(value1 ... valuen)

    實例

    my_array=(A B "C" D)

    我們也可以使用下標來定義數組:

    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2

    讀取數組

    讀取數組元素值的一般格式是:

    ${array_name[index]}

    實例

    #!/bin/bash
    
    my_array=(A B "C" D)
    
    echo "第一個元素爲: ${my_array[0]}"
    echo "第二個元素爲: ${my_array[1]}"
    echo "第三個元素爲: ${my_array[2]}"
    echo "第四個元素爲: ${my_array[3]}"

    執行腳本,輸出結果如下所示:
    chmod+xtest.sh ./test.sh
    第一個元素爲: A
    第二個元素爲: B
    第三個元素爲: C
    第四個元素爲: D

    獲取數組中的所有元素

    使用@ 或 * 可以獲取數組中的所有元素,例如:

    #!/bin/bash
    
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    
    echo "數組的元素爲: ${my_array[*]}"
    echo "數組的元素爲: ${my_array[@]}"

    執行腳本,輸出結果如下所示:

    $ chmod +x test.sh 
    $ ./test.sh
    數組的元素爲: A B C D
    數組的元素爲: A B C D

    獲取數組的長度

    獲取數組長度的方法與獲取字符串長度的方法相同,例如:

    #!/bin/bash
    
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    
    echo "數組元素個數爲: ${#my_array[*]}"
    echo "數組元素個數爲: ${#my_array[@]}"

    執行腳本,輸出結果如下所示:

    $ chmod +x test.sh 
    $ ./test.sh
    數組元素個數爲: 4
    數組元素個數爲: 4

    Shell 基本運算符

    Shell 和其他編程語言一樣,支持多種運算符,包括:

  • 算數運算符
  • 關係運算符
  • 布爾運算符
  • 字符串運算符
  • 文件測試運算符
  • 原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
    expr 是一款表達式計算工具,使用它能完成表達式的求值操作。

    例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 ‘)

    #!/bin/bash
    
    val=`expr 2 + 2`
    echo "兩數之和爲 : $val"

    執行腳本,輸出結果如下所示:

    兩數之和爲 : 4

    兩點注意:

  • 表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
  • 完整的表達式要被 ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
  • 算術運算符

    下表列出了常用的算術運算符,假定變量 a 爲 10,變量 b 爲 20:

    這裏寫圖片描述

    注意:條件表達式要放在方括號之間,並且要有空格,例如: [a== b] 是錯誤的,必須寫成 [ a== b ]。

    實例

    算術運算符實例如下:

    #!/bin/bash
    
    a=10
    b=20
    
    val=`expr $a + $b`
    echo "a + b : $val"
    
    val=`expr $a - $b`
    echo "a - b : $val"
    
    val=`expr $a \* $b`
    echo "a * b : $val"
    
    val=`expr $b / $a`
    echo "b / a : $val"
    
    val=`expr $b % $a`
    echo "b % a : $val"
    
    if [ $a == $b ]
    then
       echo "a 等於 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等於 b"
    fi

    執行腳本,輸出結果如下所示:

    a + b : 30
    a - b : -10
    a * b : 200
    b / a : 2
    b % a : 0
    a 不等於 b
    注意:
    乘號(*)前邊必須加反斜槓(\)才能實現乘法運算;
    if...then...fi 是條件語句,後續將會講解。

    關係運算符

    關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
    下表列出了常用的關係運算符,假定變量 a 爲 10,變量 b 爲 20:
    這裏寫圖片描述

    實例

    關係運算符實例如下:

    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a -eq $b ]
    then
       echo "$a -eq $b : a 等於 b"
    else
       echo "$a -eq $b: a 不等於 b"
    fi
    if [ $a -ne $b ]
    then
       echo "$a -ne $b: a 不等於 b"
    else
       echo "$a -ne $b : a 等於 b"
    fi
    if [ $a -gt $b ]
    then
       echo "$a -gt $b: a 大於 b"
    else
       echo "$a -gt $b: a 不大於 b"
    fi
    if [ $a -lt $b ]
    then
       echo "$a -lt $b: a 小於 b"
    else
       echo "$a -lt $b: a 不小於 b"
    fi
    if [ $a -ge $b ]
    then
       echo "$a -ge $b: a 大於或等於 b"
    else
       echo "$a -ge $b: a 小於 b"
    fi
    if [ $a -le $b ]
    then
       echo "$a -le $b: a 小於或等於 b"
    else
       echo "$a -le $b: a 大於 b"
    fi

    執行腳本,輸出結果如下所示:

    10 -eq 20: a 不等於 b
    10 -ne 20: a 不等於 b
    10 -gt 20: a 不大於 b
    10 -lt 20: a 小於 b
    10 -ge 20: a 小於 b
    10 -le 20: a 小於或等於 b

    布爾運算符

    下表列出了常用的布爾運算符,假定變量 a 爲 10,變量 b 爲 20:

    這裏寫圖片描述

    實例

    布爾運算符實例如下:

    #!/bin/bash
    
    a=10
    b=20
    
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等於 b"
    else
       echo "$a != $b: a 等於 b"
    fi
    if [ $a -lt 100 -a $b -gt 15 ]
    then
       echo "$a -lt 100 -a $b -gt 15 : 返回 true"
    else
       echo "$a -lt 100 -a $b -gt 15 : 返回 false"
    fi
    if [ $a -lt 100 -o $b -gt 100 ]
    then
       echo "$a -lt 100 -o $b -gt 100 : 返回 true"
    else
       echo "$a -lt 100 -o $b -gt 100 : 返回 false"
    fi
    if [ $a -lt 5 -o $b -gt 100 ]
    then
       echo "$a -lt 100 -o $b -gt 100 : 返回 true"
    else
       echo "$a -lt 100 -o $b -gt 100 : 返回 false"
    fi

    執行腳本,輸出結果如下所示:

    10 != 20 : a 不等於 b
    10 -lt 100 -a 20 -gt 15 : 返回 true
    10 -lt 100 -o 20 -gt 100 : 返回 true
    10 -lt 100 -o 20 -gt 100 : 返回 false

    邏輯運算符

    以下介紹 Shell 的邏輯運算符,假定變量 a 爲 10,變量 b 爲 20:
    這裏寫圖片描述

    實例

    邏輯運算符實例如下:

    #!/bin/bash
    
    a=10
    b=20
    
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi
    
    if [[ $a -lt 100 || $b -gt 100 ]]
    then
       echo "返回 true"
    else
       echo "返回 false"
    fi

    執行腳本,輸出結果如下所示:

    返回 false
    返回 true

    字符串運算符

    下表列出了常用的字符串運算符,假定變量 a 爲 “abc”,變量 b 爲 “efg”:

    這裏寫圖片描述

    實例

    字符串運算符實例如下:

    #!/bin/bash
    
    a="abc"
    b="efg"
    
    if [ $a = $b ]
    then
       echo "$a = $b : a 等於 b"
    else
       echo "$a = $b: a 不等於 b"
    fi
    if [ $a != $b ]
    then
       echo "$a != $b : a 不等於 b"
    else
       echo "$a != $b: a 等於 b"
    fi
    if [ -z $a ]
    then
       echo "-z $a : 字符串長度爲 0"
    else
       echo "-z $a : 字符串長度不爲 0"
    fi
    if [ -n $a ]
    then
       echo "-n $a : 字符串長度不爲 0"
    else
       echo "-n $a : 字符串長度爲 0"
    fi
    if [ $a ]
    then
       echo "$a : 字符串不爲空"
    else
       echo "$a : 字符串爲空"
    fi

    執行腳本,輸出結果如下所示:

    abc = efg: a 不等於 b
    abc != efg : a 不等於 b
    -z abc : 字符串長度不爲 0
    -n abc : 字符串長度不爲 0
    abc : 字符串不爲空

    文件測試運算符

    文件測試運算符用於檢測 Unix 文件的各種屬性。

    屬性檢測描述如下:

    這裏寫圖片描述

    實例

    變量 file 表示文件”/var/www/runoob/test.sh”,它的大小爲100字節,具有 rwx 權限。下面的代碼,將檢測該文件的各種屬性:

    #!/bin/bash
    
    file="/var/www/runoob/test.sh"
    if [ -r $file ]
    then
       echo "文件可讀"
    else
       echo "文件不可讀"
    fi
    if [ -w $file ]
    then
       echo "文件可寫"
    else
       echo "文件不可寫"
    fi
    if [ -x $file ]
    then
       echo "文件可執行"
    else
       echo "文件不可執行"
    fi
    if [ -f $file ]
    then
       echo "文件爲普通文件"
    else
       echo "文件爲特殊文件"
    fi
    if [ -d $file ]
    then
       echo "文件是個目錄"
    else
       echo "文件不是個目錄"
    fi
    if [ -s $file ]
    then
       echo "文件不爲空"
    else
       echo "文件爲空"
    fi
    if [ -e $file ]
    then
       echo "文件存在"
    else
       echo "文件不存在"
    fi

    執行腳本,輸出結果如下所示:

    文件可讀
    文件可寫
    文件可執行
    文件爲普通文件
    文件不是個目錄
    文件不爲空
    文件存在

    Shell echo命令

    Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用於字符串的輸出。命令格式:

    echo string

    您可以使用echo實現更復雜的輸出格式控制。

    1.顯示普通字符串:

    echo "It is a test"

    這裏的雙引號完全可以省略,以下命令與上面實例效果一致:

    echo It is a test

    2.顯示轉義字符

    echo "\"It is a test\""

    結果將是:

    "It is a test"

    同樣,雙引號也可以省略

    3.顯示變量

    read 命令從標準輸入中讀取一行,並把輸入行的每個字段的值指定給 shell 變量

    #!/bin/sh
    read name 
    echo "$name It is a test"

    以上代碼保存爲 test.sh,name 接收標準輸入的變量,結果將是:

    [root@www ~]# sh test.sh
    OK                     #標準輸入
    OK It is a test        #輸出

    4.顯示換行

    echo -e "OK! \n" # -e 開啓轉義
    echo "It it a test"

    輸出結果:

    OK!
    
    It it a test

    5.顯示不換行

    #!/bin/sh
    echo -e "OK! \c" # -e 開啓轉義 \c 不換行
    echo "It is a test"

    輸出結果:

    OK! It is a test

    6.顯示結果定向至文件

    echo "It is a test" > myfile

    7.原樣輸出字符串,不進行轉義或取變量(用單引號)

    echo '$name\"'

    輸出結果:

    $name\"

    8.顯示命令執行結果

      echo `date`

    結果將顯示當前日期

    Fri May 20 13:11:31 UTC 2016

    Shell printf 命令

    printf 命令模仿 C 程序庫(library)裏的 printf() 程序。

    標準所定義,因此使用printf的腳本比使用echo移植性好。

    printf 使用引用文本或空格分隔的參數,外面可以在printf中使用格式化字符串,還可以制定字符串的寬度、左右對齊方式等。默認printf不會像 echo 自動添加換行符,我們可以手動添加 \n。

    printf 命令的語法:

    printf  format-string  [arguments...]

    參數說明:

  • format-string: 爲格式控制字符串
  • arguments: 爲參數列表。
  • 實例如下:

    $ echo "Hello, Shell"
    Hello, Shell
    $ printf "Hello, Shell\n"
    Hello, Shell
    $

    接下來,我來用一個腳本來體現printf的強大功能:

    #!/bin/bash
    
    printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg  
    printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
    printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 
    printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

    執行腳本,輸出結果如下所示:

    姓名     性別   體重kg
    郭靖     男      66.12
    楊過     男      48.65
    郭芙     女      47.99

    %s %c %d %f都是格式替代符

    %-10s 指一個寬度爲10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。

    %-4.2f 指格式化爲小數,其中.2指保留2位小數。

    更多實例:

    #!/bin/bash
    
    # format-string爲雙引號
    printf "%d %s\n" 1 "abc"
    
    # 單引號與雙引號效果一樣 
    printf '%d %s\n' 1 "abc" 
    
    # 沒有引號也可以輸出
    printf %s abcdef
    
    # 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
    printf %s abc def
    
    printf "%s\n" abc def
    
    printf "%s %s %s\n" a b c d e f g h i j
    
    # 如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替
    printf "%s and %d \n" 

    執行腳本,輸出結果如下所示:

    1 abc
    1 abc
    abcdefabcdefabc
    def
    a b c
    d e f
    g h i
    j  
     and 0

    printf的轉義序列

    這裏寫圖片描述
    實例

    $ printf "a string, no processing:<%s>\n" "A\nB"
    a string, no processing:<A\nB>
    
    $ printf "a string, no processing:<%b>\n" "A\nB"
    a string, no processing:<A
    B>
    
    $ printf "www.runoob.com \a"
    www.runoob.com $                  #不換行
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章