Ubuntu 的 bash和dash的區別

2021-09-20 07:33:28 字數 2244 閱讀 7833

什麼是bash ?

bash(gnu bourne-again shell)是許多linux平台的內定shell,事實上,還有許多傳統unix上用的shell,像tcsh、csh、ash、bsh、ksh等等。

gnu/linux 作業系統中的 /bin/sh 本是 bash (bourne-again shell) 的符號鏈結,但鑑於 bash 過於複雜,有人把 bash 從 netbsd 移植到 linux 並更名為 dash (debian almquist shell),並建議將 /bin/sh 指向它,以獲得更快的指令碼執行速度。dash shell 比 bash shell 小的多,符合posix標準。

debian和ubuntu中,/bin/sh預設已經指向dash,這是乙個不同於bash的shell,它主要是為了執行指令碼而出現,而不是互動,它速度更快,但功能相比bash要少很多,語法嚴格遵守posix標準。

就是這個倒霉的dash直譯器使得我按照bash語法寫的shell 指令碼不能執行。

要知道自己的/bin/sh指向何種直譯器,可以用ls /bin/sh -al命令檢視:

$ ls /bin/sh -al

lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash

以上結果就表示當前系統用的是dash直譯器。

切換到bash的方式其實挺簡單的,關鍵是一直沒找出這個原因……

修改預設的sh,可以採用命令sudo dpkg-reconfigure dash

注:dash 和 bash 語法上的主要的區別有:

1.定義函式

bash: function在bash中為關鍵字

dash: dash中沒有function這個關鍵字

2.select var in list; do command; done

bash:支援

dash:不支援, 替代方法:採用while+read+case來實現

3. echo

bash:支援展開

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: 支援$,$

dash: 不支援, 替代方法:採用expr或cut外部命令代替

8. 大小寫轉換

bash: 支援$,$,$,$

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

NAS SAN和DAS的區別

目前磁碟儲存市場上,儲存分類 如下表一 根據伺服器型別分為 封閉系統的儲存和開放系統的儲存.封閉系統主要指大型機,as400等伺服器,開放系統指基於包括windows unix linux等作業系統的伺服器 開放系統的儲存分為 內建儲存和外掛程式儲存 開放系統的外掛程式儲存根據連線的方式分為 直連式...

C Shell 和 Bash的區別

在公司寫c shell習慣了,在家裡寫bash還真有點不習慣。下面將不同的問題羅列一下。發現一點更新一點。1.變數的宣告 csh set value1 1 等號兩邊可以有空格 bash value 1 等號兩邊千萬不要有空格,如果有空格則出現下面錯誤 不是有效的識別符號 2.變數的使用 相同的 ec...

bash的測試和比較

比較字串 string1 string2 等價於 string1 string2 比較整數 num1 eq num2 等價於 num1 num2 變數值不為空,且變數值中不包含空格的情況下,變數可不加雙引號,當然加了雙引號也可以 變數值為空或變數值中包含空格的情況下,變數一定要加雙引號 或變數沒有申...