? 最近在工作中遇到一個(gè)很奇葩的問(wèn)題,就是一個(gè)嵌入式的SDK編譯,它里面執(zhí)行shell命令的時(shí)候,使用的dash shell來(lái)解析,而通常我們默認(rèn)用的是bash shell來(lái)解析;我按照bash shell那樣照常編寫腳本,大部分的腳本是沒(méi)有問(wèn)題的,但是偏偏就被我遇到了不一樣的地方,以此文記錄下。
先說(shuō)下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 過(guò)于復(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ǔ)法嚴(yán)格遵守POSIX標(biāo)準(zhǔn)。
簡(jiǎn)單來(lái)說(shuō),就是dash是bash的簡(jiǎn)化版本,沒(méi)有支持那么復(fù)雜的東西。
再看下我遇到的問(wèn)題,為了好做對(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
![poYBAGDYdXCAWkKMAAAAK8RNs4s030.png](https://file.elecfans.com/web2/M00/03/FB/poYBAGDYdXCAWkKMAAAAK8RNs4s030.png)
OK,腳本對(duì)應(yīng)的行號(hào)如下所示:
![](https://file.elecfans.com//web2/M00/59/21/pYYBAGLkxmOAPGTuAABAPaRhMY8356.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6dWxsYw==,size_16,color_FFFFFF,t_70)
使用/bin/bash運(yùn)行,一切正常,輸出4個(gè)yes。
![](https://file.elecfans.com//web2/M00/58/82/poYBAGLkxmSAQehUAAAtVOf735Y524.png)
使用/bin/dash運(yùn)行,只有一個(gè)輸出正常,3處報(bào)錯(cuò)?。?!
![](https://file.elecfans.com//web2/M00/59/21/pYYBAGLkxmSAHnOrAABAalZ7h5Y523.png)
為何???
原來(lái),dash是很奇葩的:
- if 里面的條件語(yǔ)句只能使用 [ ] 不能使用 [[ ]];
- 字符串判斷,只能使用 = 不能使用 ==;
word天吶??!就是這么回事。
我們還可以使用 ls -al /bin/sh查看下系統(tǒng)默認(rèn)的shell解析器是什么,如下:
![](https://file.elecfans.com//web2/M00/58/82/poYBAGLkxmSAA3lJAABEm-tb-5Y746.png)
至于 [ ] 與 [[ ]] 的區(qū)別,可以參考這篇文章:Linux Shell 中的 ()、(())、[]、[[]]、{} 怎么用是不是還傻傻分不清?
==可用于判斷變量是否相等,=除了可用于判斷變量是否相等外,還可以表示賦值。
=與==在[]中表示判斷(字符串比較)時(shí)是等價(jià)的。
今天的總結(jié)就介紹到這,有什么問(wèn)題,歡迎你在評(píng)論區(qū)告訴我。
審核編輯:湯梓紅
?
-
嵌入式
+關(guān)注
關(guān)注
5094文章
19184瀏覽量
307855 -
Shell
+關(guān)注
關(guān)注
1文章
366瀏覽量
23462 -
Bash
+關(guān)注
關(guān)注
0文章
57瀏覽量
10208 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40412
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【RT-Thread學(xué)習(xí)筆記】使用scons命令生成靜態(tài)庫(kù)
![【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】使用scons命令生成靜態(tài)庫(kù)](https://file.elecfans.com/web2/M00/56/A8/poYBAGLgkRKAdlneAAD3qLF7bAM159.png)
RT-Thread學(xué)習(xí)筆記和finsh shell配置方法
RT-Thread 應(yīng)用筆記 - RTC Alarm 組件的使用
![<b class='flag-5'>RT-Thread</b> 應(yīng)用<b class='flag-5'>筆記</b> - RTC Alarm 組件的使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 理解defunct僵尸線程
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 理解defunct僵尸線程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 設(shè)備模型rt_device的理解
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 設(shè)備模型<b class='flag-5'>rt</b>_device的理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象鏈表結(jié)構(gòu)深入理解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象初始化鏈表組織方式
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象初始化鏈表組織方式](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread 內(nèi)核學(xué)習(xí)筆記 - 內(nèi)核對(duì)象操作API
![<b class='flag-5'>RT-Thread</b> 內(nèi)核<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> - 內(nèi)核對(duì)象操作API](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread學(xué)習(xí)筆記 RT-Thread的架構(gòu)概述
![<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b> <b class='flag-5'>RT-Thread</b>的架構(gòu)概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
【RT-Thread學(xué)習(xí)筆記】如何抓取終端的網(wǎng)絡(luò)報(bào)文
![【<b class='flag-5'>RT-Thread</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】如何抓取終端的網(wǎng)絡(luò)報(bào)文](https://file.elecfans.com//web2/M00/59/21/pYYBAGLkyEaAdrtuAAQbpq7iXAs377.png)
基于RT-Thread Studio學(xué)習(xí)
![基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>學(xué)習(xí)</b>](https://file1.elecfans.com/web2/M00/82/C1/wKgaomRhn_SAM7fdAACQhFt0KEA325.jpg)
評(píng)論