1、Shell變量
1.1簡(jiǎn)介
變量是任何一種編程語(yǔ)言都必不可少的組成部分,變量用來(lái)存放各種數(shù)據(jù)。腳本語(yǔ)言在定義變量時(shí)通常不需要指明類型,直接賦值就可以,Shell變量也遵循這個(gè)規(guī)則。
在Bash shell 中,每一個(gè)變量的值都是字符串,無(wú)論你給變量賦值時(shí)有沒(méi)有使用引號(hào),值都會(huì)以字符串的形式存儲(chǔ)。這意味著,Bash shell 在默認(rèn)情況下不會(huì)區(qū)分變量類型,即使你將整數(shù)和小數(shù)賦值給變量,它們也會(huì)被視為字符串,這一點(diǎn)和大部分的編程語(yǔ)言不同。如C/C++?,變量分為整數(shù)、浮點(diǎn)數(shù)、字符串、布爾等多種類型。當(dāng)然,如果有必要,你也可以使用declare/typeset Shell內(nèi)建命令顯式定義變量的類型,但在一般情況下沒(méi)有這個(gè)需求,Shell 開發(fā)者在編寫代碼時(shí)自行注意值的類型即可。
1.2變量類型
Shell中按照變量的作用域和生命周期,Shell變量可分為四大類:
1.永久環(huán)境變量:需要修改配置文件,變量永久生效。
與 Bash Shell 有關(guān)的配置文件主要有?/etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc、/etc/profile.d/*.sh,不同的啟動(dòng)方式會(huì)加載不同的配置文件。
setenv 命令也可設(shè)置環(huán)境變量。
2.臨時(shí)環(huán)境變量:使用export命令行聲明即可,變量在Shell腳本進(jìn)程結(jié)束后仍然有效,但在關(guān)閉當(dāng)前Shell會(huì)話后失效。
3.全局變量:在腳本中定義,僅在當(dāng)前Shell腳本中有效,其他Shell腳本進(jìn)程不能訪問(wèn),其作用域從定義的位置開始,到腳本結(jié)束或被顯示刪除的地方為止。注意,全局變量既可以在Shell函數(shù)內(nèi)定義,也可以在Shell函數(shù)外定義,因?yàn)镾hell函數(shù)內(nèi)定義的變量默認(rèn)為global,且作用域從“函數(shù)被調(diào)用時(shí)執(zhí)行變量定義的地方”開始,到腳本結(jié)束或被顯示刪除的地方為止。
1
2 3 |
#!/bin/bash
GlobalVar=dablelv???#全局變量 |
(4)局部變量。在Shell腳本中函數(shù)內(nèi)顯示使用local關(guān)鍵字定義的變量。其作用域局限于函數(shù)內(nèi)。同名local變量會(huì)屏蔽global變量。
1
2 3 4 5 6 7 8 |
#!/bin/bash
function?test() { local?localVar=dablelv??#局部變量 } test echo?$localVar??????????????#輸出為空 |
1.3定義變量
Shell 支持以下三種定義變量的方式:
1
2 3 |
var=value
var='value' var="value" |
var是變量名,value是賦給變量的值。如果value不包含任何空白符(例如空格、Tab等),那么可以不使用引號(hào);如果value 包含了空白符,那么就必須使用引號(hào)包圍起來(lái)。
引號(hào)有單引號(hào)和雙引號(hào)之分,二者的主要區(qū)別在于,被單引號(hào)括起來(lái)的字符都是普通字符,就算特殊字符也不再有特殊含義;而被雙引號(hào)括起來(lái)的字符中,"$"、""和反引號(hào)是擁有特殊含義的,"$"代表引用變量的值,而反引號(hào)代表引用命令。
注意,賦值號(hào)的周圍不能有空格,這可能和你熟悉的大部分編程語(yǔ)言都不一樣。
Shell變量的命名規(guī)范和大部分編程語(yǔ)言都一樣:
(1)變量名由數(shù)字、字母、下劃線組成;
(2)必須以字母或者下劃線開頭;
(3)不能使用Shell里的關(guān)鍵字(通過(guò)help命令可以查看保留關(guān)鍵字)。
變量定義示例:
1
2 3 |
name='dablelv'
home="安徽" age=28 |
1.4訪問(wèn)變量
使用一個(gè)定義過(guò)的變量,只要在變量名前面加美元符號(hào)$即可,如:
1
2 3 |
name="dablelv"
echo?$name echo?${name} |
變量名外面的花括號(hào){}是可選的,加不加都行,加花括號(hào)是為了幫助解釋器識(shí)別變量的邊界,比如下面這種情況:
1
2 |
skill="Java"
echo?"I am good at ${skill}Script" |
如果不給skill變量加花括號(hào),解釋器就會(huì)把$skillScript當(dāng)成一個(gè)變量(其值為空),代碼執(zhí)行結(jié)果就不是我們期望的樣子了。
推薦給所有變量加上花括號(hào){ },這是個(gè)良好的編程習(xí)慣。
1.5修改變量的值
已定義的變量,可以被重新賦值,如:
1
2 3 |
name='dablelv'
echo?$name name="billwong" |
第二次對(duì)變量賦值時(shí)不能在變量名前加,只有在使用變量時(shí)才能加。
1.6將命令的結(jié)果賦值給變量
Shell 也支持將命令的執(zhí)行結(jié)果賦值給變量,常見的有以下兩種方式:
1
2 |
variable=`command`
variable=$(command) |
第一種方式把命令用反引號(hào)包圍起來(lái),反引號(hào)和單引號(hào)非常相似,容易產(chǎn)生混淆,所以不推薦使用這種方式;第二種方式把命令用$()包圍起來(lái),區(qū)分更加明顯,所以推薦使用這種方式。
反引號(hào)是下圖紅色圈出的健。
例如將兩個(gè)數(shù)值相加賦給某一變量。
1
2 3 4 |
var1=1
var2=2 varAdd1=`expr?$var1 + $var2` varAdd2=$(expr?$var1 + $var2) |
1.7只讀變量
使用readonly命令,或者使用declare -r或typeset -r可以將變量定義為只讀變量,只讀變量的值不能被改變。
1
2 3 4 5 6 |
name="dablelv"
readonly name
declare?-r name="dablelv"
typeset?-r name="dablelv" |
1.8刪除變量
使用unset內(nèi)置命令可以刪除變量。語(yǔ)法:
1 | unset?variable_name |
unset命令不能刪除只讀變量。變量被刪除后不能再次使用。如
1
2 3 4 5 |
#!/bin/bash
name="dablelv" unset?name echo?$name |
上面的腳本沒(méi)有任何輸出。
2、TCL變量
2.1變量命名
變量的名稱可以包含任何字符和長(zhǎng)度。甚至可以存在空格被封閉在大括號(hào)中的變量,但不建議這樣做。
set命令用于指定值的變量。set 命令的語(yǔ)法是:
變量的幾個(gè)例子如下所示。
當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。
正如可以在上面的方案看到,$variableName 用于獲取變量的值。
2.2動(dòng)態(tài)類型
TCL是一種動(dòng)態(tài)類型語(yǔ)言。變量的值可以在需要時(shí)被動(dòng)態(tài)地轉(zhuǎn)換為所需的類型。例如,一個(gè)數(shù)字5,其被存儲(chǔ)為字符串將做的算術(shù)運(yùn)算時(shí)被轉(zhuǎn)換為數(shù)字。它如下所示
當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。
2.3數(shù)學(xué)表達(dá)式
正如在上面的例子中看到,expr是用于表示數(shù)學(xué)表達(dá)式。Tcl默認(rèn)精度為12位。為了得到浮點(diǎn)運(yùn)算的結(jié)果,我們應(yīng)該增加至少一個(gè)十進(jìn)制數(shù)字。一個(gè)簡(jiǎn)單的例子說(shuō)明了上述情況。
浮點(diǎn)計(jì)算是指浮點(diǎn)數(shù)參與的運(yùn)算,這種運(yùn)算通常伴隨著因?yàn)闊o(wú)法精確表示而進(jìn)行的近似或舍入。
當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。
在上面的例子中,可以看到三種情況。第一種情況,被除數(shù)和除數(shù)是整數(shù),得到一個(gè)整數(shù)作為結(jié)果。第二種情況,除數(shù)是小數(shù)以及第三種情況,分?jǐn)?shù)是一個(gè)十進(jìn)制數(shù)。在第二和第三情況下,得到的是十進(jìn)制數(shù)作的結(jié)果。
在上面的代碼,可以使用tcl_precision特殊變量改變精度。它如下所示。
當(dāng)上述代碼被執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果。
2.4 相關(guān)命令
Unset ,刪除變量:
append和incr,改變變量的值:
append 命令把文本加到一個(gè)變量的后面。
incr 命令把一個(gè)變量值加上一個(gè)整數(shù)。incr 要求變量原來(lái)的值和新加的值都必須是整數(shù)。
3、Perl變量
變量是存儲(chǔ)在內(nèi)存中的數(shù)據(jù),創(chuàng)建一個(gè)變量即會(huì)在內(nèi)存上開辟一個(gè)空間。
解釋器會(huì)根據(jù)變量的類型來(lái)決定其在內(nèi)存中的存儲(chǔ)空間,因此你可以為變量分配不同的數(shù)據(jù)類型,如整型、浮點(diǎn)型、字符串等。
上一章節(jié)中我們已經(jīng)為大家介紹了Perl的三個(gè)基本的數(shù)據(jù)類型:標(biāo)量、數(shù)組、哈希。
標(biāo)量?$?開始,?如$a $b 是兩個(gè)標(biāo)量。
數(shù)組?@?開始?,?如?@a @b 是兩個(gè)數(shù)組。
哈希?%?開始?,?%a %b 是兩個(gè)哈希。
Perl 為每個(gè)變量類型設(shè)置了獨(dú)立的命令空間,所以不同類型的變量可以使用相同的名稱,你不用擔(dān)心會(huì)發(fā)生沖突。例如?$foo 和?@foo 是兩個(gè)不同的變量。
3.1創(chuàng)建變量
變量不需要顯式聲明類型,在變量賦值后,解釋器會(huì)自動(dòng)分配匹配的類型空間。
變量使用等號(hào)(=)來(lái)賦值。
等號(hào)左邊為變量,右邊為值,實(shí)例如下:
以上代碼中?25, "runoob"?和?1445.50?分別賦值給?$age,?$name?和?$salary?變量。
接下來(lái)我們會(huì)看到數(shù)組和哈希的使用。
3.2標(biāo)量變量
標(biāo)量是一個(gè)單一的數(shù)據(jù)單元。數(shù)據(jù)可以是整數(shù),浮點(diǎn)數(shù),字符,字符串,段落等。簡(jiǎn)單的說(shuō)它可以是任何東西。以下是標(biāo)量的簡(jiǎn)單應(yīng)用:
以上程序執(zhí)行輸出結(jié)果為:
3.3數(shù)組變量
數(shù)組是用于存儲(chǔ)一個(gè)有序的標(biāo)量值的變量。
數(shù)組?@?開始。
要訪問(wèn)數(shù)組的變量,可以使用美元符號(hào)($)+變量名,并指定下標(biāo)來(lái)訪問(wèn),實(shí)例如下所示:
以上程序執(zhí)行輸出結(jié)果為:
程序中我們?cè)?$ 標(biāo)記前使用了轉(zhuǎn)義字符 () ,這樣才能輸出字符 $。
3.4哈希變量
哈希是一個(gè) key/value 對(duì)的集合。
哈希?%?開始。
如果要訪問(wèn)哈希值,可以使用?$ + {key}?格式來(lái)訪問(wèn):
以上程序執(zhí)行輸出結(jié)果為:
3.5變量上下文股林秘籍
所謂上下文:指的是表達(dá)式所在的位置。
上下文是由等號(hào)左邊的變量類型決定的,等號(hào)左邊是標(biāo)量,則是標(biāo)量上下文,等號(hào)左邊是列表,則是列表上下文。
Perl 解釋器會(huì)根據(jù)上下文來(lái)決定變量的類型。實(shí)例如下:
以上程序執(zhí)行輸出結(jié)果為:
代碼中?@names 是一個(gè)數(shù)組,它應(yīng)用在了兩個(gè)不同的上下文中。第一個(gè)將其復(fù)制給另外一個(gè)數(shù)組,所以它輸出了數(shù)組的所有元素。第二個(gè)我們將數(shù)組賦值給一個(gè)標(biāo)量,它返回了數(shù)組的元素個(gè)數(shù)。
以下列出了多種不同的上下文:
參考文獻(xiàn)
https://www.runoob.com/linux/linux-shell-variable.html
https://baijiahao.baidu.com/s?id=1719888934878375622&wfr=spider&for=pc
https://www.jb51.net/article/194562.htm
http://c.biancheng.net/view/951.html
https://blog.51cto.com/u_15338162/5215417
https://blog.csdn.net/m0_62079168/article/details/127199994
https://blog.csdn.net/u011641885/article/details/45974471
https://www.runoob.com/perl/perl-variables.html