shell script 學習筆記-----shell變數,學習筆記-----shell
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