私のRed Hat Linuxシステムに/bin/sh
リンクがあります。bash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 27 13:17 /bin/sh -> bash
この設計されたテストプログラムを直接実行すると、期待した回答が得られました。
$ cat ./test.sh
#!/bin/sh
# Just a test program to illustrate an issue
case "b" in
(a) echo "a"; break;;
(b) echo "b"; break;;
(c) echo "c"; break;;
esac
$ ./test.sh
b
ただし、明示的に実行またはbash
呼び出す最初の行を変更するとbash
エラーが発生します。私はこれがおそらく本当のバグであるbash
ことを知っています。しかし、なぜこのような違いはありますか?
$ /bin/bash ./test.sh
b
./test.sh: line 5: break: only meaningful in a `for', `while', or `until' loop
$ sed -e 's/sh/bash/' test.sh > test1.sh
$ chmod 777 test1.sh
$ ./test1.sh
b
./test1.sh: line 5: break: only meaningful in a `for', `while', or `until' loop
答え1
man
ページからbash
:
名前でbashを呼び出すとシェン、履歴バージョンの開始動作を模倣しようとします。シェンPOSIX規格を維持しながらできるだけ近い。
でもそう言うと、POSIXの定義ofにはブロック内での使用はbreak
含まれません。case
このman
ページには、次のような内容も記載されています(の定義に従ってcase
)。
もし;;;演算子を使用すると、最初のパターンマッチングの後に後続のマッチングが試行されなくなります。
そしてPOSIXの定義言ったcase
:
条件付き構成ケースでは、次の対応する複合リストを実行する必要があります。最初複数のパターン
したがって、結論は、最初のゲームが終了した後に停止する必要はないということですbreak
。case
答え2
Bashのマニュアルページから:
bash が sh 名で呼び出されると、POSIX 標準に準拠しながら、sh の以前のバージョンの起動動作をできるだけ近い模倣しようとします。
break
C / C ++とは異なり、シェルスクリプトではスイッチ/ケースステートメントを使用する必要はありません。