1. ホーム
  2. bash

ケースステートメントのフォールスルー?

2023-09-05 11:02:04

質問

一般的な命令型言語では、switch文はcase文にマッチすると次のレベルにフォールスルーされるのが一般的です。

int a = 2;
switch(a)
{
   case 1:
      print "quick ";
   case 2: 
      print "brown ";
   case 3: 
      print "fox ";
      break;
   case 4:
      print "jumped ";
}

は "brown fox" と表示されます。

しかし、同じコードをbashで実行すると

A=2
case $A in
2)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
4)
  echo "JUMPED"
  ;&
esac

は "BROWN"のみを表示します。

最初の例のように、bashのcase文が"fall through"で残りの条件になるようにするにはどうしたらよいでしょうか。

(編集: Bashバージョン3.2.25では、;&ステートメント( wikiより ) はシンタックスエラーになります)

を実行しています。

test.shを実行します。

#!/bin/bash
A=2
case $A in
1)
  echo "QUICK"
  ;&
2)
  echo "BROWN"
  ;&
3)
  echo "FOX"
  ;&
esac

与える。

./test.sh: 6行目: 予期しないトークン付近のシンタックスエラー ;' ./test.sh:
line 6:
;&'

どのように解決するのですか?

この場合 ;&;;& 演算子は bash 4.0 で導入されたので、5年前のバージョンの bash にこだわるのであれば、コードを繰り返すか、あるいは if s.

if (( a == 1)); then echo quick; fi
if (( a > 0 && a <= 2)); then echo brown; fi 
if (( a > 0 && a <= 3)); then echo fox; fi
if (( a == 4)); then echo jumped; fi

または、実際の目標を達成するための他の方法を見つけてください。

(余談ですが はすべて大文字の変数名を使用しないでください。 . 特殊なシェル変数や環境変数を上書きしてしまう危険性があります)。