GNU/Linux 操作系統中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符號鏈接,但鑒於 bash 過於復雜,有人把 ash 從 NetBSD 移植到 Linux 並更名為 dash (Debian Almquist Shell),並建議將 /bin/sh 指向它,以獲得更快的腳本執行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX標準。
Debian和Ubuntu中,/bin/sh默認已經指向dash,這是壹個不同於bash的shell,它主要是為了執行腳本而出現,而不是交互,它速度更快,但功能相比bash要少很多,語法嚴格遵守POSIX標準。
語法上的主要的區別有:
1.定義函數
bash: function在bash中為關鍵字
dash: dash中沒有function這個關鍵字
2.select var in list; do command; done
bash:支持
dash:不支持, 替代方法:采用while+read+case來實現
3. echo {0..10}
bash:支持{n..m}展開
dash:不支持,替代方法, 采用seq外部命令
4. here string
bash:支持here string
dash:不支持, 替代方法:可采用here documents
5. >&word重定向標準輸出和標準錯誤
bash: 當word為非數字時,>&word變成重定向標準錯誤和標準輸出到文件word
dash: >&word, word不支持非數字, 替代方法: >word 2>&1; 常見用法 >/dev/null 2>&1
6. 數組
bash: 支持數組, bash4支持關聯數組
dash: 不支持數組,替代方法, 采用變量名+序號來實現類似的效果
7. 子字符串擴展
bash: 支持${parameter:offset:length},${parameter:offset}
dash: 不支持, 替代方法:采用expr或cut外部命令代替
8. 大小寫轉換
bash: 支持${parameter^pattern},${parameter^^pattern},${parameter,pattern},${parameter,,pattern}
dash: 不支持,替代方法:采用tr/sed/awk等外部命令轉換
9. 進程替換<(command), >(command)
bash: 支持進程替換
dash: 不支持, 替代方法, 通過臨時文件中轉
10. [ string1 = string2 ] 和 [ string1 == string2 ]
bash: 支持兩者
dash: 只支持=
11. [[ 加強版test
bash: 支持[[ ]], 可實現正則匹配等強大功能
dash: 不支持[[ ]], 替代方法,采用外部命令
12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done
bash: 支持C語言格式的for循環
dash: 不支持該格式的for, 替代方法,用while+$((expression))實現
13. let命令和((expression))
bash: 有內置命令let, 也支持((expression))方式
dash: 不支持,替代方法,采用$((expression))或者外部命令做計算
14. $((expression))
bash: 支持id++,id--,++id,--id這樣到表達式
dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1