1. 程式人生 > 其它 >《The Missing Semester of Your CS Education》Shell 工具和指令碼

《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,whilefor這些控制流關鍵字。同樣地, ,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)

,shell首先將呼叫ls,然後遍歷得到的這些返回值。

還有一個冷門的類似特性是程序替換process substitution),<( CMD )會執行CMD並將結果輸出到一個臨時檔案中,並將<( CMD )替換成臨時檔名。這在我們希望返回值通過檔案而不是STDIN傳遞時很有用。例如,diff <(ls foo) <(ls bar)會顯示資料夾foobar中檔案的區別。

工具:shellcheck,用以檢查語法錯誤,debian安裝 apt-get install shellcheck,使用 shellcheck xxx.sh會輸出錯誤資訊。

關於shell指令碼還可以參考《鳥哥的LINUX私房菜》第12章,以後用到再學。