變量是任何一種編程語言都必不可少的組成部分,變量用來存放各種數(shù)據(jù)光坝。腳本語言在定義變量時(shí)通常不需要指明類型尸诽,直接賦值就可以,Shell 變量也遵循這個(gè)規(guī)則盯另。
在 Bash shell 中性含,每一個(gè)變量的值都是字符串,無論你給變量賦值時(shí)有沒有使用引號(hào)鸳惯,值都會(huì)以字符串的形式存儲(chǔ)商蕴。
這意味著,Bash shell 在默認(rèn)情況下不會(huì)區(qū)分變量類型芝发,即使你將整數(shù)和小數(shù)賦值給變量绪商,它們也會(huì)被視為字符串,這一點(diǎn)和大部分的編程語言不同辅鲸。例如在C語言或者 C++ 中格郁,變量分為整數(shù)、小數(shù)独悴、字符串例书、布爾等多種類型。
當(dāng)然刻炒,如果有必要决采,你也可以使用 Shell declare 關(guān)鍵字顯式定義變量的類型,但在一般情況下沒有這個(gè)需求坟奥,Shell 開發(fā)者在編寫代碼時(shí)自行注意值的類型即可树瞭。
1拇厢、定義變量
1.1、Shell 支持以下三種定義變量的方式:
variable=value
variable='value'
variable="value"
variable 是變量名晒喷,value 是賦給變量的值孝偎。如果 value 不包含任何空白符(例如空格、Tab 縮進(jìn)等)厨埋,那么可以不使用引號(hào)邪媳;如果 value 包含了空白符,那么就必須使用引號(hào)包圍起來荡陷。使用單引號(hào)和使用雙引號(hào)也是有區(qū)別的雨效,稍后我們會(huì)詳細(xì)說明。
注意废赞,賦值號(hào)=的周圍不能有空格徽龟,這可能和你熟悉的大部分編程語言都不一樣。
Shell 變量的命名規(guī)范和大部分編程語言都一樣:
變量名由數(shù)字唉地、字母据悔、下劃線組成;
必須以字母或者下劃線開頭耘沼;
不能使用 Shell 里的關(guān)鍵字(通過 help 命令可以查看保留關(guān)鍵字)极颓。
變量定義舉例:
url=http://www.reibang.com/
echo $url
name='簡書'
echo $name
author="五公子"
echo $author
1.2、將命令的結(jié)果賦值給變量
Shell 也支持將命令的執(zhí)行結(jié)果賦值給變量群嗤,常見的有以下兩種方式:
variable=`command`
variable=$(command)
第一種方式把命令用反引號(hào)(位于 Esc 鍵的下方)包圍起來菠隆,反引號(hào)和單引號(hào)非常相似,容易產(chǎn)生混淆狂秘,所以不推薦使用這種方式骇径;第二種方式把命令用$()包圍起來,區(qū)分更加明顯者春,所以推薦使用這種方式破衔。
例如:
variable=`date`
variable=$(date)
1.3、只讀變量
使用 readonly 命令可以將變量定義為只讀變量钱烟,只讀變量的值不能被改變晰筛。
下面的例子嘗試更改只讀變量,結(jié)果報(bào)錯(cuò):
url="http://www.reibang.com/"
readonly url
url="http://www.reibang.com/"
運(yùn)行腳本拴袭,結(jié)果如下:
bash: url: readonly variable
1.4读第、修改變量的值
已定義的變量,可以被重新賦值稻扬,如:
url="http://www.reibang.com/"
echo ${url}
url="http://www.reibang.com/shell/"
echo ${url}
只有在使用變量時(shí)才能加$。
2羊瘩、使用變量
使用一個(gè)定義過的變量泰佳,只要在變量名前面加美元符號(hào)$即可盼砍,如:
author="五公子"
echo $author
echo ${author} #推薦
變量名外面的花括號(hào){ }是可選的,加不加都行逝她,加花括號(hào)是為了幫助解釋器識(shí)別變量的邊界浇坐,比如下面這種情況:
skill="[Java](http://c.biancheng.net/java/)"
echo "I am good at ${skill}Script"
如果不給 skill 變量加花括號(hào),寫成echo "I am good at skillScript 當(dāng)成一個(gè)變量(其值為空)近刘,代碼執(zhí)行結(jié)果就不是我們期望的樣子了。
推薦給所有變量加上花括號(hào){ }臀晃,這是個(gè)良好的編程習(xí)慣觉渴。
4.單引號(hào)和雙引號(hào)的區(qū)別
前面我們還留下一個(gè)疑問,定義變量時(shí)徽惋,變量的值可以由單引號(hào)' '包圍案淋,也可以由雙引號(hào)" "包圍,它們到底有什么區(qū)別呢险绘?不妨以下面的代碼為例來說明:
url="http://www.reibang.com/"
website1='簡書:${url}'
website2="簡書:${url}"
echo $website1
echo $website2
運(yùn)行結(jié)果:
簡書:${url}
簡書:http://www.reibang.com/
以單引號(hào)' '包圍變量的值時(shí)踢京,單引號(hào)里面是什么就輸出什么,即使內(nèi)容中有變量和命令(命令需要反引起來)也會(huì)把它們?cè)瓨虞敵龌鹿住_@種方式比較適合定義顯示純字符串的情況瓣距,即不希望解析變量、命令等的場(chǎng)景代咸。
以雙引號(hào)" "包圍變量的值時(shí)蹈丸,輸出時(shí)會(huì)先解析里面的變量和命令,而不是把雙引號(hào)中的變量名和命令原樣輸出侣背。這種方式比較適合字符串中附帶有變量和命令并且想將其解析后再輸出的變量定義白华。
建議:如果變量的內(nèi)容是數(shù)字,那么可以不加引號(hào)贩耐;如果真的需要原樣輸出就加單引號(hào)弧腥;其他沒有特別要求的字符串等最好都加上雙引號(hào),定義變量時(shí)加雙引號(hào)是最常見的使用場(chǎng)景潮太。
3管搪、刪除變量
使用 unset 命令可以刪除變量。語法:
unset variable_name
變量被刪除后不能再次使用铡买;unset 命令不能刪除只讀變量更鲁。
例如:
myUrl="http://www.reibang.com/"
unset myUrl
echo ${myUrl}
上面的腳本沒有任何輸出。
轉(zhuǎn)載自:http://c.biancheng.net/view/743.html