? 最近在工作中遇到一個很奇葩的問題,就是一個嵌入式的SDK編譯,它里面執行shell命令的時候,使用的dash shell來解析,而通常我們默認用的是bash shell來解析;我按照bash shell那樣照常編寫腳本,大部分的腳本是沒有問題的,但是偏偏就被我遇到了不一樣的地方,以此文記錄下。
先說下bash shell與bash shell的關系。
什么是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的簡化版本,沒有支持那么復雜的東西。
再看下我遇到的問題,為了好做對比,我分別寫了1個腳本,分別用bash和dash去解析運行,得出不同的答案。
腳本內容如下:
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,腳本對應的行號如下所示:
使用/bin/bash運行,一切正常,輸出4個yes。
使用/bin/dash運行,只有一個輸出正常,3處報錯!!!
為何???
原來,dash是很奇葩的:
- if 里面的條件語句只能使用 [ ] 不能使用 [[ ]];
- 字符串判斷,只能使用 = 不能使用 ==;
word天吶!!就是這么回事。
我們還可以使用 ls -al /bin/sh查看下系統默認的shell解析器是什么,如下:
至于 [ ] 與 [[ ]] 的區別,可以參考這篇文章:Linux Shell 中的 ()、(())、[]、[[]]、{} 怎么用是不是還傻傻分不清?
==可用于判斷變量是否相等,=除了可用于判斷變量是否相等外,還可以表示賦值。
=與==在[]中表示判斷(字符串比較)時是等價的。
今天的總結就介紹到這,有什么問題,歡迎你在評論區告訴我。
審核編輯:湯梓紅
?
-
嵌入式
+關注
關注
5082文章
19104瀏覽量
304815 -
Shell
+關注
關注
1文章
365瀏覽量
23356 -
Bash
+關注
關注
0文章
57瀏覽量
10179 -
RT-Thread
+關注
關注
31文章
1285瀏覽量
40085
發布評論請先 登錄
相關推薦
評論