1. 程式人生 > >sh與bash執行語法嚴謹問題

sh與bash執行語法嚴謹問題

在Linux中,我們知道有幾種方式可以執行.sh指令碼

  • 通過sh或者bash命令來執行
  • 通過source來執行
  • 通過./xxx.sh來執行(這種方式要求對指令碼檔案有rx許可權才行)

今天在寫指令碼的過程中,遇到了一個問題,關於[]判斷符,指令碼如下:

#!/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功能,當然其中沒有包含[]樣式的測試。