自己寫的一個while循環(huán)結(jié)構(gòu)總是報錯,糾結(jié)了一下午椅棺,各種查資料犁罩、改命令行,最后發(fā)現(xiàn)是ubuntu系統(tǒng)解釋器的原因两疚,腳本沒有問題床估,換一下解釋器就OK了。郁卒的要死……
Ubuntu 的 bash和dash的區(qū)別
什么是bash 鬼雀?
Bash(GNU Bourne-Again Shell)是許多Linux平臺的內(nèi)定Shell顷窒,事實上,還有許多傳統(tǒng)UNIX上用的Shell源哩,像tcsh鞋吉、csh、ash励烦、bsh谓着、ksh等等。
GNU/Linux 操作系統(tǒng)中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符號鏈接坛掠,但鑒于 bash 過于復(fù)雜赊锚,有人把 bash 從 NetBSD 移植到 Linux 并更名為 dash (Debian Almquist Shell)治筒,并建議將 /bin/sh 指向它,以獲得更快的腳本執(zhí)行速度舷蒲。Dash Shell 比 Bash Shell 小的多耸袜,符合POSIX標(biāo)準(zhǔn)。
Debian和Ubuntu中牲平,/bin/sh默認(rèn)已經(jīng)指向dash堤框,這是一個不同于bash的shell,它主要是為了執(zhí)行腳本而出現(xiàn)纵柿,而不是交互蜈抓,它速度更快,但功能相比bash要少很多昂儒,語法嚴(yán)格遵守POSIX標(biāo)準(zhǔn)沟使。
就是這個倒霉的dash解釋器使得我按照bash語法寫的shell 腳本不能運(yùn)行。
要知道自己的/bin/sh指向何種解釋器渊跋,可以用 ls /bin/sh -al 命令查看:
? ? ? ? $ ls /bin/sh -al
? ? ? ? lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash
以上結(jié)果就表示當(dāng)前系統(tǒng)用的是dash解釋器腊嗡。
切換到bash的方式其實挺簡單的,關(guān)鍵是一直沒找出這個原因……
修改默認(rèn)的sh刹枉,可以采用命令sudo dpkg-reconfigure dash
會出現(xiàn)一個圖片狀的配置菜單叽唱,選no就可以了
再次檢查一下, ls /bin/sh -al 發(fā)現(xiàn)軟鏈接指向/bin/bash
? ? ? ? ?lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash
參考資料:Ubuntu 的 bash和dash的區(qū)別_Linux教程_Linux公社-Linux系統(tǒng)門戶網(wǎng)站
感謝度娘N⒈Α!
注:dash 和 bash 語法上的主要的區(qū)別有:
1.定義函數(shù)
bash: function在bash中為關(guān)鍵字
dash: dash中沒有function這個關(guān)鍵字
2.select var in list; do command; done
bash:支持
dash:不支持, 替代方法:采用while+read+case來實現(xiàn)
3. echo {0..10}
bash:支持{n..m}展開
dash:不支持虎眨,替代方法, 采用seq外部命令
4. here string
bash:支持here string
dash:不支持, 替代方法:可采用here documents
5. >&word重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤
bash: 當(dāng)word為非數(shù)字時蟋软,>&word變成重定向標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出到文件word
dash: >&word, word不支持非數(shù)字, 替代方法: >word 2>&1; 常見用法 >/dev/null 2>&1
6. 數(shù)組
bash: 支持?jǐn)?shù)組, bash4支持關(guān)聯(lián)數(shù)組
dash: 不支持?jǐn)?shù)組,替代方法, 采用變量名+序號來實現(xiàn)類似的效果
7. 子字符串?dāng)U展
bash: 支持${parameter:offset:length},${parameter:offset}
dash: 不支持嗽桩, 替代方法:采用expr或cut外部命令代替
8. 大小寫轉(zhuǎn)換
bash: 支持${parameter^pattern},${parameter^^pattern},${parameter,pattern},${parameter,,pattern}
dash: 不支持岳守,替代方法:采用tr/sed/awk等外部命令轉(zhuǎn)換
9. 進(jìn)程替換<(command), >(command)
bash: 支持進(jìn)程替換
dash: 不支持, 替代方法, 通過臨時文件中轉(zhuǎn)
10. [ string1 = string2 ] 和 [ string1 == string2 ]
bash: 支持兩者
dash: 只支持=
11. [[ 加強(qiáng)版test
bash: 支持[[ ]], 可實現(xiàn)正則匹配等強(qiáng)大功能
dash: 不支持[[ ]], 替代方法,采用外部命令
12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done
bash: 支持C語言格式的for循環(huán)
dash: 不支持該格式的for, 替代方法碌冶,用while+$((expression))實現(xiàn)
13. let命令和((expression))
bash: 有內(nèi)置命令let, 也支持((expression))方式
dash: 不支持湿痢,替代方法,采用$((expression))或者外部命令做計算
14. $((expression))
bash: 支持id++,id--,++id,--id這樣到表達(dá)式
dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1