1、在賦值語句name=value中不能存在空格,例如:name = value這樣的形式會被認(rèn)為是三個變量,因為本質(zhì)上來說,腳本的內(nèi)容就是傳給shell程序的變量,而變量之間是通過空格區(qū)分的。如果想要在value里面出現(xiàn)空格,則需要用引號標(biāo)注出來,想要應(yīng)用變量的內(nèi)容則在變量名前加‘$’符號,如下:
2、當(dāng)我們需要在一些非空格字符之間插入變量時,例如:為了腳本的擴(kuò)展性,常在路徑名/home/my$USERtxt中用變量取代一部分內(nèi)容,但是這樣做的話,我們其實無法區(qū)分變量名是USER還是USERtxt,解決方法其實很簡單,把變量名用花括號括起來即可,如/home/my${USER}txt
3、定義變量時,在變量名前加export就可以將該變量變?yōu)槿肿兞浚⑶铱梢栽谧觭hell中調(diào)用它,不過需要注意的是,該全局變量是通過“值傳遞”的方式進(jìn)入子shell的,類似與C語言中的函數(shù)參數(shù),雖然在子函數(shù)中改變了它的值,但是它原本的值并沒有改變。那么有沒有類似指針的東西能直接改變原變量的值呢?回答是,沒有。(通過env或者export -p命令可以查看全部的全局變量)
4、同時我們能像C語言一樣直接給shell腳本傳遞命令行參數(shù),在腳本中$1就表示第一個參數(shù),$2表示第二個參數(shù),以此類推,需要注意的是,當(dāng)表示第十個以上的參數(shù)時,需要用花括號將序號括起來,例如:${10},因為$10會被分解為$1和0。這里需要注意的是,如果命令行參數(shù)表示的字符串里有空格,那么在輸入命令行是要將該參數(shù)用引號括起來,同時在腳本里引用時,也要使用引號,例如:ls "${1}",否則在腳本內(nèi)部,該參數(shù)也會被誤認(rèn)為由空格分割的多個參數(shù)
5、在腳本中,符號$*表示所有的命令行參數(shù),我們可以用如下方式對其進(jìn)行遍歷,不過通常我們更推薦使用"$@",因為它能在命令行參數(shù)內(nèi)部有空格的時候?qū)⑵鋮^(qū)分開來
6、變量$#用于統(tǒng)計命令行參數(shù)的個數(shù):
7、變量的默認(rèn)值:1)B=${A:-"xxx"}表示如果變量A未設(shè)置或值為空,則B=“xxx”,2)與:-符號不同的是${A:="xxx"}表示如果A未設(shè)置或為空,則將A設(shè)置為''xxx'并且返回值"xxx",你可以認(rèn)為:-只做返回值,而不做賦值。3)${A="xxx"}表示當(dāng)且僅當(dāng)變量A未被設(shè)置,它的值置為"xxx",這么做的意思就是允許變量名的默認(rèn)值為空
8、數(shù)組變量的定義與使用如下所示:
9、最后,其實在變量賦值的時候,如果使用了雙引號,那么雙引號內(nèi)的可以不僅僅是字符串,實際上shell會將引號內(nèi)的內(nèi)容進(jìn)行解析。例如引號內(nèi)的$HOME將被替換成變量HOME的值,$(pwd)將被替換成命令pwd的輸出,$((1+1))則將被替換成1+1運算的結(jié)果
參考文獻(xiàn):《bash Cookbook》,Carl Albing
新聞熱點
疑難解答