77

一般的な命令型言語では、通常、case ステートメントが一致すると、switch ステートメントは次のレベルに "フォール スルー" します。

例:

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

「茶色のキツネ」を出力します。

ただし、bash の同じコード

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

「BROWN」のみ印刷

最初の例のように、bash の case ステートメントを残りの条件に「フォールスルー」させるにはどうすればよいですか?

(編集: 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:

4

4 に答える 4

54

;∧;&演算子はbash4.0で導入されたため、5年前のバージョンのbashを使い続ける場合は、コードを繰り返すか、sを使用する必要がありますif

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

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

(ちなみに、すべて大文字の変数名を使用しないでください。特別なシェル変数または環境変数を上書きするリスクがあります。)

于 2012-08-17T18:07:03.987 に答える
48

これを試して:

case $VAR in
normal)
    echo "This doesn't do fallthrough"
    ;;
fallthrough)
    echo -n "This does "
    ;&
somethingelse)
    echo "fall-through"
    ;;
esac
于 2015-08-21T12:04:40.230 に答える