《The Missing Semester of Your CS Education》Shell 工具和指令碼
我對shell指令碼的理解是寫一個檔案指示shell如何執行命令
bash中的shell指令碼語法:
1.在bash中為變數賦值的語法是foo=bar
,訪問變數中儲存的數值,其語法為$foo
。 需要注意的是,foo = bar
(使用空格隔開)是不能正確工作的,因為直譯器會呼叫程式foo
並將=
和bar
作為引數。 總的來說,在shell指令碼中使用空格會起到分割引數的作用,有時候可能會造成混淆,請務必多加檢查。
2.Bash中的字串通過'
和"
分隔符來定義,但是它們的含義並不相同。以'
定義的字串為原義字串,其中的變數不會被轉義,而"
定義的字串會將變數值進行替換。
foo=bar
echo "$foo"
# 列印 bar
echo '$foo'
# 列印 $foo
3.bash
也支援if
,case
,while
和for
這些控制流關鍵字。同樣地, ,bash
也支援函式,它可以接受引數並基於引數進行操作。
mcd () {
mkdir -p "$1"
cd "$1"
}
這裡$1
是指令碼的第一個引數。與其他指令碼語言不同的是,bash使用了很多特殊的變數來表示引數、錯誤程式碼和相關變數。
$0
- 指令碼名$1
到$9
- 指令碼的引數。$1
是第一個引數,依此類推。$@
- 所有引數$#
- 引數個數$?
- 前一個命令的返回值$$
- 當前指令碼的程序識別碼!!
- 完整的上一條命令,包括引數。常見應用:當你因為許可權不足執行命令失敗時,可以使用sudo !!
$_
- 上一條命令的最後一個引數。如果你正在使用的是互動式shell,你可以通過按下Esc
之後鍵入 . 來獲取這個值。
命令通常使用STDOUT
來返回輸出值,使用STDERR
來返回錯誤及錯誤碼,便於指令碼以更加友好的方式報告錯誤。 返回碼或退出狀態是指令碼/命令之間交流執行狀態的方式。返回值0表示正常執行,其他所有非0的返回值都表示有錯誤發生。
4.另一個常見的模式是以變數的形式獲取一個命令的輸出,這可以通過命令替換(command substitution)實現。
當您通過$( CMD )
這樣的方式來執行CMD
這個命令時,它的輸出結果會替換掉$( CMD )
。例如,如果執行for file in $(ls)
ls
,然後遍歷得到的這些返回值。
還有一個冷門的類似特性是程序替換(process substitution),<( CMD )
會執行CMD
並將結果輸出到一個臨時檔案中,並將<( CMD )
替換成臨時檔名。這在我們希望返回值通過檔案而不是STDIN傳遞時很有用。例如,diff <(ls foo) <(ls bar)
會顯示資料夾foo
和bar
中檔案的區別。
工具:shellcheck,用以檢查語法錯誤,debian安裝 apt-get install shellcheck,使用 shellcheck xxx.sh會輸出錯誤資訊。
關於shell指令碼還可以參考《鳥哥的LINUX私房菜》第12章,以後用到再學。