最近看進階BASH編程一書,說以記下些覺得有用的東西。
1. 指令碼中的“#!”字元,這兩個字元其實是兩個位元組的魔法字元,後面接路徑名,指定用來解釋指令碼的程式。
例如:
#!/bin/bash
#!/bin/ksh
當我們的指令碼中的第一行包含了以上設定後,只需要給指令碼加上可執行許可權:chmod +rx shellname 或 chmod 555 shellname。我們就可以通過直接執行檔案名稱來執行指令碼。而不用像這樣調用:sh shellname 或 bash shellname 等等。
當指令碼中包含多行的#!字元時,第一個被調用的命令直譯器程式將視其它的#開頭的行為注釋行。
還可以藉助#!玩些小技巧:
自刪除指令碼:
#!/bin/rm
echo "remove me" #此指令碼將什麼也不發生,除了刪除它自己。
在README檔案的第一行加入:
#!/bin/more
並且把README檔案屬性改為可執行,你會發現它呈現了README的內容。
2. 特殊字元
# --此字元用來進行注釋,可以出現在指令碼命令的 空格後: echo "hello,world" #這裡是注釋
但是當此字元被轉義時將失去注釋功能: echo "hello, # world" #hello與world之間的#將被列印
echo hello /# world #這裡的#被斜杠/轉義,所以失去注釋功能被列印。
; --此為命令分隔字元,可以使指令碼中一行執行多個命令: echo "hello,world" ; echo "hello2,world" ;
;; --此為case選項的終止符:
case $var<br /> "1") echo "var = 1" ;;<br /> "2") echo "var = 2" ;;<br />esac
. --此命令等價於source命令,用系統內建;
當.作為檔案名稱的開頭時,此檔案將被隱藏,使用ls -a才可顯示出來;
當.作為檔案夾名時,它表示當前檔案夾;
當.作為字元匹配時,它用來匹配任何單個字元;
()與{}的區別;這兩個符號都可以定義一個代碼塊,但是()中定義的代碼塊將在一個新shell中運行,{}中的代碼塊不能在新shell中運行,{}中的代碼塊像指令碼中的函數,與函數不同的是,函數中的局部變數指令碼中的其他程式不能使用,但是{}中的局部變數可以。
指令碼中實現在後台運行一個迴圈:
#!/bin/bash</p><p>for i in 1 2 3 4 5 6<br />do<br />echo $i<br />done& #這裡在後台運行此迴圈</p><p>for i in 11 22 33 44 55 66<br />do<br />echo $i<br />done
- 斷橫線的應用:用於重新導向stdout或stdin.
從一個目錄移動整個分類樹到另一個目錄:
(cd /test1 && tar cf - .) | ( cd /test2 && tar xpvf -)
cd /test1 #進入test1目錄
&& #如果上面執行成功則繼續後面的命令
tar cf - . # 'c'建立一個新文檔,'f'後面跟'-'指定目錄檔案作為stdout,'-'後面的'f'(file)選項指明作為stdout的目標檔案,並在目前的目錄'.'執行。
tar xpvf - # 'x'解檔,'p'保證所有權和檔案屬性,'v'發完整訊息到stdout,'f'後邊跟'-',從stdin 讀取資料。