這次讓我們暫時丟開command line,先來了解一下bash變量(variable)吧...
所謂的變量,就是就是利用一個特定的"名稱"(name)來存取一段可以變化的"值"(value)。
*設定(set)*
在bash中,你可以用"="來設定或重新定義變量的內容:
name=value
在設定變量的時侯,得遵守如下規則:
*等號左右兩邊不能使用區隔符號(IFS),也應避免使用shell的保留字符(meta charactor)。
*變量名稱不能使用$符號。
*變量名稱的第一個字母不能是數字(number)。
*變量名稱長度不可超過256個字母。
*變量名稱及變量值之大小寫是有區別的(case sensitive)。
如下是一些變量設定時常見的錯誤:
A= B :不能有IFS
1A=B :不能以數字開頭
$A=B :名稱不能有$
a=B :這跟a=b是不同的
如下則是可以接受的設定:
A=" B" :IFS被關閉了(請參考前面的quoting章節)
A1=B :並非以數字開頭
A=$B :$可用在變量值內
This_Is_A_Long_Name=b :可用_連接較長的名稱或值,且大小寫有別。
*變量替換(substitution)*
Shell之所以強大,其中的一個因素是它可以在命令行中對變量作替換(substitution)處理。
在命令行中使用者可以使用$符號加上變量名稱(除了在用=號定義變量名稱之外),
將變量值給替換出來,然後再重新組建命令行。
比方:
$ A=ls
$ B=la
$ C=/tmp
$ $A -$B $C
(注意:以上命令行的第一個$是shell prompt,並不在命令行之內。)
必需強調的是,我們所提的變量替換,只發生在command line上面。(是的,讓我們再回到command line吧﹗)
仔細分析最後那行command line,不難發現在被執行之前(在輸入CR字符之前),
$符號會對每一個變量作替換處理(將變量值替換出來再重組命令行),最後會得出如下命令行:
ls -la /tmp
還記得第二章我請大家"務必理解"的那兩句嗎?若你忘了,那我這裏再重貼一遍:
若從技術細節來看,shell會依據IFS(Internal Field Seperator)將command line所輸入的文字給拆解爲"字段"(word)。
然後再針對特殊字符(meta)先作處理,最後再重組整行command line。
這裏的$就是command line中最經典的meta之一了,就是作變量替換的﹗
在日常的shell操作中,我們常會使用echo命令來查看特定變量的值,例如:
$ echo $A -$B $C
我們已學過,echo命令只單純將其argument送至"標準輸出"(STDOUT,通常是我們的熒幕)。
所以上面的命令會在熒幕上得到如下結果:
ls -la /tmp
這是由於echo命令在執行時,會先將$A(ls)、$B(la)、跟$C(/tmp)給替換出來的結果。
利用shell對變量的替換處理能力,我們在設定變量時就更爲靈活了:
A=B
B=$A
這樣,B的變量值就可繼承A變量"當時"的變量值了。
不過,不要以"數學羅輯"來套用變量的設定,比方說:
A=B
B=C
這樣並不會讓A的變量值變成C。
上面是單純定義了兩個不同名稱的變量:A與 B,它們的值分別是B與 C。再如:
A=B
B=$A
A=C
同樣也不會讓B的值換成C。
若變量被重複定義的話,則原有舊值將被新值所取代。(這不正是"可變的量"嗎? ^_^)
當我們在設定變量的時侯,請記着這點:
*用一個名稱儲存一個數值
僅此而已。
此外,我們也可利用命令行的變量替換能力來"擴充"(append)變量值:
A=B:C:D
A=$A:E
這樣,第一行我們設定A的值爲"B:C:D",然後,第二行再將值擴充爲"A:B:C:E"。
上面的擴充範例,我們使用區隔符號( : )來達到擴充目的,
要是沒有區隔符號的話,如下是有問題的:
A=BCD
A=$AE
因爲第二次是將A的值繼承$AE的提換結果,而非$A再加E﹗
要解決此問題,我們可用更嚴謹的替換處理:
A=BCD
A=${A}E
上例中,我們使用{}將變量名稱的範圍給明確定義出來,
如此一來,我們就可以將A的變量值從BCD給擴充爲BCDE。
(提示:關於${name}事實上還可做到更多的變量處理能力,這些均屬於比較進階的變量處理,現階段暫時不介紹了,請大家自行參考數據。如CU的貼子:
http://www.chinaunix.net/forum/viewtopic.php?t=201843)
* export *
嚴格來說,我們在當前shell中所定義的變量,均屬於"本地變量"(local variable),
只有經過export命令的"輸出"處理,才能成爲環境變量(environment variable):
$ A=B
$ export A
或:
$ export A=B
經過export輸出處理之後,變量A就能成爲一個環境變量供其後的命令使用。
在使用export 的時侯,請別忘記shell在命令行對變量的"替換"(substitution)處理,
比方說:
$ A=B
$ B=C
$ export $A
上面的命令並未將A輸出爲環境變量,而是將B作輸出,
這是因爲在這個命令行中,$A會首先被提換出B然後再"塞回"作export的參數。
要理解這個export,事實上需要從process的角度來理解才能透徹。
我將於下一章爲大家說明process的觀念,敬請留意。
*取消變量*
要取消一個變量,在bash中可使用unset命令來處理:
unset A
與export一樣,unset命令行也同樣會作變量替換(這其實就是shell的功能之一),
因此:
$ A=B
$ B=C
$ unset $A
事實上所取消的變量是B而不是A。
此外,變量一旦經過unset取消之後,其結果是將整個變量拿掉,而不僅是取消其變量值。
如下兩行其實是很不一樣的:
$ A=
$ unset A
第一行只是將變量A設定爲"空值"(null value),但第二行則讓變量A不在存在。
雖然用眼睛來看,這兩種變量狀態在如下命令結果中都是一樣的:
$ A=
$ echo $A
$ unset A
$ echo $A
[版權聲