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