sh與bash執行語法嚴謹問題
阿新 • • 發佈:2018-12-13
在Linux中,我們知道有幾種方式可以執行.sh
指令碼
- 通過
sh
或者bash
命令來執行 - 通過
source
來執行 - 通過
./xxx.sh
來執行(這種方式要求對指令碼檔案有r
和x
許可權才行)
今天在寫指令碼的過程中,遇到了一個問題,關於[]
判斷符,指令碼如下:
#!/bin/bash # Program # 這個程式會判斷使用者輸入的是否為Y或者N # History # 2018/10/03 DingNan first release read -p "make your choice Y(y) or N(n): " flag [ "$flag" == "Y" -o "$flag" == "y" ] && echo "OK, continue" && exit 0 [ "$flag" == "N" -o "$flag" == "n" ] && echo "Oh, interrupt" && exit 0 echo "I don't know what you choice is\n" && exit 0
環境為Debian
。通過sh
來執行指令碼會得到錯誤的輸出結果,類似這種
sh05.sh: 8: [: Y: unexpected operator
sh05.sh: 9: [: Y: unexpected operator
但其實指令碼本身是沒有任何問題的。怎麼說呢,如果你通過bash
來執行這個指令碼,你會發現,可以得到正確的輸出。
其原因如下:
bash
語法是sh
語法的超集 - 系統上的/bin/sh
可執行檔案可能只提供標準的sh
功能,當然其中沒有包含[]
樣式的測試。