Shell支持自定義變量shell
定義變量時,變量名不加美圓符號($),如:bash
variableName="value"
注意:變量名和等號之間不能有空格函數
變量名的命名必須遵照如下規則:spa
變量定義舉例:命令行
myName="Sherry" myAge=100
使用一個定義過的變量,只要在變量名前面加美圓符號($)便可,如:code
myName="Sherry" echo $myName echo ${myName}
變量名外面的大括號可加可不加,加大括號是爲了讓解釋器識別變量的邊界,好比:進程
myName="Sherry" echo "${myName}Me"
若是不給myName變量加花括號,寫成echo "$myNameMe",解釋器就會把$myNameMe當成一個變量(其值爲空),與預期不符。因此強烈建議給全部變量加上花括號。table
已定義的變量,能夠被從新定義,好比:class
myName="Sherry" echo "${myName}" myName="Susan" echo "${myName}"
使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。test
myName="Sherry" readonly myName myName="Sherry"
運行腳本後會報錯:
./test.sh: myUrl: readonly variable
使用unset命令能夠刪除變量。語法:
unset variable_name
變量被刪除後不能再次使用,若被引用不會有任何的輸出;unset命令不能刪除只讀變量。
運行shell時,會同時存在三種變量:
1)局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。
2)環境變量
全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。
3)shell變量
shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行。
前面已經講到,變量名只能包含數字、字母和下劃線,由於某些包含其餘字符的變量有特殊含義,這樣的變量被稱爲特殊變量。
變量 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的全部參數。 |
$@ | 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。 |
運行腳本時傳遞給腳本的參數稱爲命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。
以下腳本:
#!/bin/bash echo "File Name: $0" echo "First Parameter : $1" echo "First Parameter : $2" echo "Quoted Values: $@" echo "Quoted Values: $*" echo "Total Number of Parameters : $#"
運行結果以下:
$./test.sh Sherry Lv File Name: ./test.sh First Parameter : Sherry First Parameter : Lv Quoted Values: Sherry Lv Quoted Values: Sherry Lv Total Number of Parameters : 2
$* 和 $@ 都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出全部參數。
可是當它們被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數。
下面的例子能夠清楚的看到 $* 和 $@ 的區別:
#!/bin/bash echo "\$*=" $* echo "\"\$*\"=" "$*" echo "\$@=" $@ echo "\"\$@\"=" "$@" echo "print each param from \$*" for var in $* do echo "$var" done echo "print each param from \$@" for var in $@ do echo "$var" done echo "print each param from \"\$*\"" for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do echo "$var" done
執行 ./test.sh "a" "b" "c" "d",看到下面的結果:
$*= 1 2 3 4 "$*"= 1 2 3 4 $@= 1 2 3 4 "$@"= 1 2 3 4 print each param from $* 1 2 3 4 print each param from $@ 1 2 3 4 print each param from "$*" 1 2 3 4 print each param from "$@" 1 2 3 4
$? 能夠獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,通常狀況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其餘值,表示不一樣類型的錯誤。
$ echo $? 0
$? 也能夠表示函數的返回值,後續將會講解。