Shell中的變量和參數(shù)如何定義和使用?
變量是編程和腳本語(yǔ)言表示數(shù)據(jù)的方式。變量其實(shí)不僅僅是一個(gè)標(biāo)簽,一個(gè)分配給計(jì)算機(jī)內(nèi)存中保存項(xiàng)目的位置或位置集的數(shù)據(jù)的標(biāo)簽,變量沒(méi)有其他意義。
變量出現(xiàn)在算術(shù)運(yùn)算和和數(shù)量操作中,以及字符串解析時(shí)。
變量的名稱(chēng)是對(duì)它所持有的數(shù)據(jù)的占位符(代名詞)。引用(檢索)其值稱(chēng)為變量替換。獲取變量值使用美元符號(hào):
$
讓我們仔細(xì)區(qū)分變量的 名稱(chēng) 及 變量值。如果 variable1 是 變量,則 $variable 是對(duì)其值的引用, 它包含的數(shù)據(jù)項(xiàng)。
從技術(shù)上講,變量的名稱(chēng)稱(chēng)為左值,這意味著它出現(xiàn) 在作業(yè)的左側(cè) 語(yǔ)句,如 VARIABLE=23 所示。變量的值為 右值,這意味著 它出現(xiàn)在賦值語(yǔ)句的右側(cè),如 VAR2=$VARIABLE。事實(shí)上,變量的名稱(chēng)是引用,是指向內(nèi)存的指針,即該變量的值被保留在變量指向的內(nèi)存位置起始的內(nèi)存字節(jié)空間中。
用一段shell命令演示變量的定義、賦值、讀?。╞ash$ 后面的是具體執(zhí)行的shell命令):
bash$ variable1=23bash$ echo variable1variable1bash$ echo $variable123
以“裸露”方式使用變量(沒(méi)有 $ 前綴)的唯一時(shí)間是 聲明或分配、未設(shè)置時(shí)、導(dǎo)出(export)時(shí)、 在雙括號(hào)內(nèi)的算術(shù)表達(dá)式中 (( variable1 )),或者在變量的特殊情況下 表示信號(hào)時(shí)(參見(jiàn)示例 32-5)。
示例 32-5:shell的變量與信號(hào)
#!/bin/bash# Hunting variables with a trap.trap 'echo Variable Listing --- a = $a b = $b' EXIT# EXIT is the name of the signal generated upon exit from a script.## The command specified by the "trap" doesn't execute until#+ the appropriate signal is sent.echo "This prints before the /"trap/" --"echo "even though the script sees the /"trap/" first."echoa=39b=36exit 0# Note that commenting out the 'exit' command makes no difference,#+ since the script exits in any case after running out of commands.
賦值可以帶有 =(如 var1=27), 在 READ 語(yǔ)句中:
#!/bin/bash# 讀取用戶(hù)輸入echo "請(qǐng)輸入你的名字:"read name# 輸出用戶(hù)輸入的內(nèi)容echo "你輸入的名字是:$name"
或在循環(huán)的頭部(for var2 in 1 2 3方式循環(huán)給變量var2賦值并打印值):
bash$ for var2 in 1 2 3;do echo $var2;done123
將引用的值括在英文的雙引號(hào)中 ("...") 不會(huì)干擾變量操作。這是被稱(chēng)為部分引用 或稱(chēng)為“弱引用”。
使用英文的單引號(hào) ('...') 導(dǎo)致按字面意思使用變量名,而不是將其替換為實(shí)際值。如:
var1=123echo '$var1'# 輸出結(jié)果為 $var1, 也就是原原本本,未做變量替換。echo "$var1"# 輸出結(jié)果為123, 也就是雙引號(hào)有會(huì)按變量替換。
單引號(hào)內(nèi)的變量效果是全引用,有時(shí)稱(chēng)為“強(qiáng)”引用。請(qǐng)參閱第 5 章 詳細(xì)討論SHELL的引用[1]。
請(qǐng)注意,$variable實(shí)際上是 ${variable} 的簡(jiǎn)化形式。在有的shell上下文中 語(yǔ)法會(huì)導(dǎo)致錯(cuò)誤,那時(shí)使用{variable}`形式可能是推薦的做法(請(qǐng)參閱下面的第 10.2 節(jié) SHELL的參數(shù)[2])。
#!/bin/bash# ex9.sh# 變量:賦值和替換a=375hello=$a# ---------------------------------------# 賦值時(shí),等號(hào)兩邊不能有空格,否則初始化變量時(shí)會(huì)出錯(cuò)。# 如果有空格會(huì)怎樣?# "VARIABLE =value"# ^#% 腳本嘗試運(yùn)行"VARIABLE"命令,參數(shù)為"="value"。# "VARIABLE= value"# ^#% 腳本嘗試運(yùn)行"value"命令,將"VARIABLE"設(shè)置為空字符串。# ---------------------------------------echo hello # hello# 對(duì)echo來(lái)說(shuō),這不是變量引用,只是字符串"hello"...echo $hello # 375# ^# 這是變量引用。echo ${hello} # 375# ^# 同樣是變量引用。# 引用...echo "$hello" # 375echo "${hello}" # 375echohello="A B C D"echo $hello # A B C Decho "$hello" # A B C D# 可以看到,echo $hello 和 echo "$hello" 的輸出結(jié)果不同。# =======================================# 引用變量時(shí)保留空格。# =======================================`echo '$hello' # $hello`:輸出變量 $hello,該變量被單引號(hào)括起來(lái),因此不會(huì)進(jìn)行變量替換。# 這演示了單引號(hào)的作用,即禁用變量引用,導(dǎo)致 $ 被解釋為字面量。# 注意不同類(lèi)型引號(hào)的影響。hello= # 將變量 hello 設(shè)置為空值。echo "/$hello (null value) = $hello" # 輸出變量 $hello的值,該變量為空值。所以打印結(jié)果為 $hello (null value) = # 注意將變量設(shè)置為空值與取消設(shè)置變量不同,盡管最終結(jié)果相同(見(jiàn)下文)。# 允許在同一行設(shè)置多個(gè)變量,如果用空格分隔開(kāi)。# 可能會(huì)導(dǎo)致舊版“sh”出現(xiàn)問(wèn)題......# 如果變量中嵌入了空格,則需要使用雙引號(hào)包裹。numbers="one two three"echo "numbers = $numbers"other_numbers=1 2 3 # 會(huì)報(bào)錯(cuò)說(shuō)bash: 2: command not found# 使用雙引號(hào)包裹other_numbers="1 2 3" # 不會(huì)報(bào)錯(cuò)echo "other_numbers = $other_numbers" # 此時(shí)輸出為:other_numbers = 1 2 3# 也可以用/符號(hào),作為前導(dǎo)轉(zhuǎn)義空格mixed_bag=2/ ---/ Whatever # 設(shè)置變量 mixed_bag 的值,包含一個(gè)轉(zhuǎn)義空格。那么mixed_bag的值為"2 --- Whatever"這字符串。echo "$mixed_bag" # 2 --- Whatever`:輸出變量 mixed_bag 的值。echo; echo`:輸出空行。echo "uninitialized_variable = $uninitialized_variable" # 輸出變量 uninitialized_variable,該變量具有空值。uninitialized_variable= # 聲明,但不初始化它 -- #+ 與將其設(shè)置為 null 值相同,如上所述。echo "uninitialized_variable = $uninitialized_variable" # 輸出變量 uninitialized_variable,該變量仍然具有空值。uninitialized_variable=23 # 設(shè)置變量 uninitialized_variable 的值。unset uninitialized_variable # 取消設(shè)置變量 unitialized_variable。使用unset命令echo "uninitialized_variable = $unitialized_variable" # 輸出變量 uninitialized_variable,該變量已被取消設(shè)置,具有空值。exit 0
以上例子中,未初始化的變量,有一個(gè)"null"值,不是字符串"null",而是未賦值的狀態(tài)。變量的為賦值狀態(tài),可以用if [ -z "$xxxx" ] 的-z 參數(shù)去判斷。
if [ -z "$unassigned" ]then echo "/$unassigned is NULL."fi # $unassigned is NULL.
直接使用未賦值的變量,可能引起一些問(wèn)題,但可以對(duì)未賦值的變量做算數(shù)運(yùn)算,達(dá)到初始化變量的效果。例如:
echo "$uninitialized" # 空行空變量let "uninitialized += 5" # 將該空變量加 5 echo "$uninitialized" # 現(xiàn)在該變量有值了,等于5# 注意# shell中,未初始化的變量沒(méi)有值。# 但在shell的算數(shù)運(yùn)算中使用未初始化的變量,則該變量將被作為值等于0的變量使用。
參考資料:
本文鏈接:http://www.www897cc.com/showinfo-26-59674-0.html基礎(chǔ)不牢地動(dòng)山搖——shell中的變量和參數(shù)如何定義和使用?有什么注意點(diǎn)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com