Shell腳本編程-變量
shell腳本中,變量都是字符串,可分爲三大類:自定義變量、系統變量和環境變量。
一、自定義變量
自定義變量是用戶自己定義的或者其他腳本文件中定義的變量。
1. 自定義變量的定義:
varname="varvalue" 或者 varname=varvalue 或者 varname='varvalue'
上面三種定義變量的語法都是合法的,爲什麼會有這幾種形式,稍後在說明雙引號(")和單引號(')在shell腳本中的區別時解釋。如果在變量在函數內加上local來修飾,則變量是局部變量。局部變量的值侷限於函數內。
經過上面的定義,我們就得到了一個名爲varname的變量名,其值爲varvalue(字符串)
注意事項:=(等號)兩邊不要有空格,否則變量名就會被解釋爲一個命令。
2.變量的賦值:
事實上,變量的賦值和變量的定義是一回事,這裏區別開來只是爲了幾種特殊的變量賦值方式。我們可以採用和定義時候樣的語法來給一個已經賦值了的變量重新賦值。除了這種賦值方式,我們還有以下幾種條件賦值:
2.1 空值置換:
${varname:-value}
上面這個表達式的意思爲:當varname變量爲空或沒有定義時,使用value的值代替整個表達式的值,但不對varname賦值,即varname變量還是爲空。
2.2 有值置換:
${varname:+value}
與控制置換相反, 表示varname變量的值不爲空時,則使用value的值代替整個表達式是的值,但不對varname賦值。
2.3 空值賦值:
${varname:=value}
表示當varname爲空時,使用value的值代替整個表達式的值,並且value的值會賦值給varname。與空值置換相比,空值賦值會改變varname的值。
2.4 空值出錯:
${varanme:?["error"]}
表示當varname爲空爲沒有定義時,會報錯。如果寫了["error.."]則可以根據 ? 問號後面給出的字符串來打印錯誤信息。如果沒有則根據系統默認的錯誤來打印信息。
3. 變量的取值
要想取得變量的值,需要在變量前面加上一個特殊的符號 $ ,例如我們想使用上面的變量varname,$varname其含義就等於字符串varvalue。下面討論變量取值的一些特殊表示。
3.1 $varname
變量取值最簡單的表示,$緊跟着需要被取值的變量名。
3.2 ${varname}
當變量名後面緊跟着其他的字符時,爲了隔離變量名與字符,可以使用${}將變量名包含在裏面,這樣就不會出現歧義。
4. 變量的導出
如果一個變量需要傳遞給腳本中執行的腳本文件,那麼需要使用export將變量導出。
export varname
導出之後,就可以在子腳本文件中直接使用這個變量。
5. 雙引號(")與單引號(')的區別
使用雙引號括住的字符串會解釋輸出,單引號括住的字符串原樣輸出。看下面的例子:
varname="abc"
echo "$varname"
echo '$varname'
輸出爲:
abc
$varname
從輸出我們可以知道,$varname在雙引號中,會根據變量本身的值來顯示,而單引號則把裏面的內容當做簡單的字符串處理,並不會解釋裏面的變量。
二、系統變量
系統變量是我們腳本運行時,不需要我們定義就已經存在的變量,系統變量的值也可能爲空。下面逐一介紹。
1. $[0,1,2,3....n]
腳本執行參數。$0表示當前腳本的命令,$1$n表示執行腳本的命令行參數,以空格分割。
2. $#
命令行參數個數。例如:./echo.sh abc efg hij,則$#的值爲3,表示有3個命令行參數。
3. $?
前面的命令或函數的返回值,一般情況下,0表示前面的命令或函數成功執行,沒有發生錯誤。
4. $*
將所有的命令行參數以空格隔開,組合成一整個字符串。形如:"abc efg hij"。
5. $@
將每一個命令行參數都作爲一個字符串。形如:"abc" "efg" "hij'
6. $$
本程序的進程號(PID)
7. $!
上一個命令的進程號(PID)
三、環境變量
1. PATH
命令搜索路徑,與shell中PATH一樣。
2. HOME
用戶home目錄的路徑名,與shell中的HOME一樣。
3.IFS
定義shell使用的分隔符,指命令行參數的分隔符
4.LOGNAME
用戶登錄名
5.SHELL
shell路徑名
6.TERM
終端類型
7. LD_LIBRARY_PATH
尋找庫的路徑,以冒號分割