Shell中的變量和參數如何定義和使用?
變量是編程和腳本語言表示數據的方式。變量其實不僅僅是一個標簽,一個分配給計算機內存中保存項目的位置或位置集的數據的標簽,變量沒有其他意義。
變量出現在算術運算和和數量操作中,以及字符串解析時。
變量的名稱是對它所持有的數據的占位符(代名詞)。引用(檢索)其值稱為變量替換。獲取變量值使用美元符號:
$
讓我們仔細區分變量的 名稱 及 變量值。如果 variable1 是 變量,則 $variable 是對其值的引用, 它包含的數據項。
從技術上講,變量的名稱稱為左值,這意味著它出現 在作業的左側 語句,如 VARIABLE=23 所示。變量的值為 右值,這意味著 它出現在賦值語句的右側,如 VAR2=$VARIABLE。事實上,變量的名稱是引用,是指向內存的指針,即該變量的值被保留在變量指向的內存位置起始的內存字節空間中。
用一段shell命令演示變量的定義、賦值、讀取(bash$ 后面的是具體執行的shell命令):
bash$ variable1=23bash$ echo variable1variable1bash$ echo $variable123
以“裸露”方式使用變量(沒有 $ 前綴)的唯一時間是 聲明或分配、未設置時、導出(export)時、 在雙括號內的算術表達式中 (( variable1 )),或者在變量的特殊情況下 表示信號時(參見示例 32-5)。
示例 32-5:shell的變量與信號
#!/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 語句中:
#!/bin/bash# 讀取用戶輸入echo "請輸入你的名字:"read name# 輸出用戶輸入的內容echo "你輸入的名字是:$name"
或在循環的頭部(for var2 in 1 2 3方式循環給變量var2賦值并打印值):
bash$ for var2 in 1 2 3;do echo $var2;done123
將引用的值括在英文的雙引號中 ("...") 不會干擾變量操作。這是被稱為部分引用 或稱為“弱引用”。
使用英文的單引號 ('...') 導致按字面意思使用變量名,而不是將其替換為實際值。如:
var1=123echo '$var1'# 輸出結果為 $var1, 也就是原原本本,未做變量替換。echo "$var1"# 輸出結果為123, 也就是雙引號有會按變量替換。
單引號內的變量效果是全引用,有時稱為“強”引用。請參閱第 5 章 詳細討論SHELL的引用[1]。
請注意,$variable實際上是 ${variable} 的簡化形式。在有的shell上下文中 語法會導致錯誤,那時使用{variable}`形式可能是推薦的做法(請參閱下面的第 10.2 節 SHELL的參數[2])。
#!/bin/bash# ex9.sh# 變量:賦值和替換a=375hello=$a# ---------------------------------------# 賦值時,等號兩邊不能有空格,否則初始化變量時會出錯。# 如果有空格會怎樣?# "VARIABLE =value"# ^#% 腳本嘗試運行"VARIABLE"命令,參數為"="value"。# "VARIABLE= value"# ^#% 腳本嘗試運行"value"命令,將"VARIABLE"設置為空字符串。# ---------------------------------------echo hello # hello# 對echo來說,這不是變量引用,只是字符串"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" 的輸出結果不同。# =======================================# 引用變量時保留空格。# =======================================`echo '$hello' # $hello`:輸出變量 $hello,該變量被單引號括起來,因此不會進行變量替換。# 這演示了單引號的作用,即禁用變量引用,導致 $ 被解釋為字面量。# 注意不同類型引號的影響。hello= # 將變量 hello 設置為空值。echo "/$hello (null value) = $hello" # 輸出變量 $hello的值,該變量為空值。所以打印結果為 $hello (null value) = # 注意將變量設置為空值與取消設置變量不同,盡管最終結果相同(見下文)。# 允許在同一行設置多個變量,如果用空格分隔開。# 可能會導致舊版“sh”出現問題......# 如果變量中嵌入了空格,則需要使用雙引號包裹。numbers="one two three"echo "numbers = $numbers"other_numbers=1 2 3 # 會報錯說bash: 2: command not found# 使用雙引號包裹other_numbers="1 2 3" # 不會報錯echo "other_numbers = $other_numbers" # 此時輸出為:other_numbers = 1 2 3# 也可以用/符號,作為前導轉義空格mixed_bag=2/ ---/ Whatever # 設置變量 mixed_bag 的值,包含一個轉義空格。那么mixed_bag的值為"2 --- Whatever"這字符串。echo "$mixed_bag" # 2 --- Whatever`:輸出變量 mixed_bag 的值。echo; echo`:輸出空行。echo "uninitialized_variable = $uninitialized_variable" # 輸出變量 uninitialized_variable,該變量具有空值。uninitialized_variable= # 聲明,但不初始化它 -- #+ 與將其設置為 null 值相同,如上所述。echo "uninitialized_variable = $uninitialized_variable" # 輸出變量 uninitialized_variable,該變量仍然具有空值。uninitialized_variable=23 # 設置變量 uninitialized_variable 的值。unset uninitialized_variable # 取消設置變量 unitialized_variable。使用unset命令echo "uninitialized_variable = $unitialized_variable" # 輸出變量 uninitialized_variable,該變量已被取消設置,具有空值。exit 0
以上例子中,未初始化的變量,有一個"null"值,不是字符串"null",而是未賦值的狀態。變量的為賦值狀態,可以用if [ -z "$xxxx" ] 的-z 參數去判斷。
if [ -z "$unassigned" ]then echo "/$unassigned is NULL."fi # $unassigned is NULL.
直接使用未賦值的變量,可能引起一些問題,但可以對未賦值的變量做算數運算,達到初始化變量的效果。例如:
echo "$uninitialized" # 空行空變量let "uninitialized += 5" # 將該空變量加 5 echo "$uninitialized" # 現在該變量有值了,等于5# 注意# shell中,未初始化的變量沒有值。# 但在shell的算數運算中使用未初始化的變量,則該變量將被作為值等于0的變量使用。
參考資料:
本文鏈接:http://www.www897cc.com/showinfo-26-59674-0.html基礎不牢地動山搖——shell中的變量和參數如何定義和使用?有什么注意點
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Rust 切片與 Go 有何區別?