bash shell和dash shell的區(qū)別詳解
最近在工作中遇到一個(gè)很奇葩的問題,就是一個(gè)嵌入式的SDK編譯,它里面執(zhí)行shell命令的時(shí)候,使用的dash shell來解析,而通常我們默認(rèn)用的是bash shell來解析;我按照bash shell那樣照常編寫腳本,大部分的腳本是沒有問題的,但是偏偏就被我遇到了不一樣的地方,以此文記錄下。
先說下bash shell與bash shell的關(guān)系。
什么是bash ?
Bash(GNU Bourne-Again Shell)是許多Linux平臺(tái)的內(nèi)定Shell,事實(shí)上,還有許多傳統(tǒng)UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。
GNU/Linux 操作系統(tǒng)中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符號(hào)鏈接,但鑒于 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,這是一個(gè)不同于bash的shell,它主要是為了執(zhí)行腳本而出現(xiàn),而不是交互,它速度更快,但功能相比bash要少很多,語法嚴(yán)格遵守POSIX標(biāo)準(zhǔn)。
簡(jiǎn)單來說,就是dash是bash的簡(jiǎn)化版本,沒有支持那么復(fù)雜的東西。
再看下我遇到的問題,為了好做對(duì)比,我分別寫了1個(gè)腳本,分別用bash和dash去解析運(yùn)行,得出不同的答案。
腳本內(nèi)容如下:
result=1234 if [[ "$result" == "1234" ]]; then echo "yes" else echo "no" fi if [ "$result" == "1234" ]; then echo "yes" else echo "no" fi if [[ "$result" = "1234" ]]; then echo "yes" else echo "no" fi if [ "$result" = "1234" ]; then echo "yes" else echo "no" fi
OK,腳本對(duì)應(yīng)的行號(hào)如下所示:
使用/bin/bash運(yùn)行,一切正常,輸出4個(gè)yes。
使用/bin/dash運(yùn)行,只有一個(gè)輸出正常,3處報(bào)錯(cuò)!??!
為何???
原來,dash是很奇葩的:
- if 里面的條件語句只能使用 [ ] 不能使用 [[ ]];
- 字符串判斷,只能使用 = 不能使用 ==;
word天吶?。【褪沁@么回事。
我們還可以使用 ls -al /bin/sh查看下系統(tǒng)默認(rèn)的shell解析器是什么,如下:
至于 [ ] 與 [[ ]] 的區(qū)別,可以參考這篇文章:Linux Shell 中的 ()、(())、[]、[[]]、{} 怎么用是不是還傻傻分不清?
== 可用于判斷變量是否相等,= 除了可用于判斷變量是否相等外,還可以表示賦值。
= 與 == 在 [ ] 中表示判斷(字符串比較)時(shí)是等價(jià)的。
到此這篇關(guān)于bash shell和dash shell的區(qū)別詳解的文章就介紹到這了,更多相關(guān)bash shell和dash shell內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下自動(dòng)刪除過期備份和自動(dòng)異地備份的腳本
這篇文章主要介紹了Linux下自動(dòng)刪除過期備份和自動(dòng)異地備份,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Shell腳本用for循環(huán)遍歷參數(shù)的方法技巧
今天小編就為大家分享一篇關(guān)于Shell腳本用for循環(huán)遍歷參數(shù)的方法技巧,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03shell腳本實(shí)現(xiàn)一鍵獲取linux內(nèi)存/cpu/磁盤IO信息
這篇文章主要為大家詳細(xì)介紹了如何通過shell腳本實(shí)現(xiàn)一鍵獲取linux內(nèi)存/cpu/磁盤IO等信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2024-12-12ping發(fā)現(xiàn)掉包報(bào)警的shell代碼
一般用來判斷服務(wù)器是否穩(wěn)定,加入crontab中讓其10分鐘跑一次,需要的朋友可以參考下2013-01-01