shell一些技巧和知識點
; 表示的是一個命令執行完, 忽略其返回值, 繼續執行下一行
www.2cto.com
&& 表示只有前面為true才繼續執行後面的命令, 否則忽略, 可以理解為短路執行
|| 表示子前面為false才繼續執行後面的命令, 這個比以前看到的解釋更容易理解
凡是要輸出字符串的, 最好用引號括起來, 否則容易被shell理解為命令, 這一點很容易疏忽
{}是一種命令塊的寫法
:可以看成append操作
www.2cto.com
export用來將一個變量升級為環境變量
str=
這行代碼表示將str這個變量設置為null
${str:-+=expr} 這些操作忘記了, 還需要鞏固一下
source會將script看成當前shell進程的一部分, 而不是生成一個sub shell進程來執行腳本, source用來加載公共的函數, 可以理解為import
exec用來結束當前shell進程, 並重新生成一個新的進程來執行腳本
()用來將多個命令放到一個sub shell進程中去執行, 可以理解為將表達式變成函數
{} 理解成匿名函數吧, 一般在awk中常見
$()和``是一回事, 不過前者辨識度更高, 建議常用, 後者容易與''混淆, 另外一個前者嵌套起來更簡單, 不過前者移植性較差
${}除了用來界定變量之外, 還有一個功能實現字符串變量的substring操作, #表示去掉左邊的, %表示去掉右邊的, 單數表示最小匹配, 雙數表示最大匹配, 可以通過鍵盤上#和%相對於$的位置來記憶, linux上的命令參數大部分記憶起來很傷腦筋:(
${}還可以用來設置默認值, 這塊更復雜, 不記也罷
${#str}用來計算變量的字符長度
()的另一個作用是用來定義一個數組, 而針對數組的訪問則利用的是[], 注意數組的下標base是0, 另外@用來表示全部, 可以理解為all
$(())只針對算數和邏輯運算, 裡面的變量可以不用帶上$前綴, 當然帶上也不為錯
shell中的0表示true, 非零表示false
(())用來直接進行運算, 會讓我們的代碼更簡潔, 比如變量不用加$前綴
$0表示的是腳本路徑, $1...n代表的是腳本路徑之後的參數
函數可以理解為腳本中的腳本, 不過函數中$0表示的仍然是腳本路徑, 而不是函數名
$10不是表示第十個參數而是第一個參數後面帶一個0
一般#跟數量關系比較大, 比如${#str}表示變量長度, 而$#表示參數個數, 測試是否有傳參數 [ $# = 0 ]