条件が失敗した場合に基づくケース

条件が失敗した場合に基づくケース

私はbashのケース条件内のif条件に基づいて失敗する方法を探しています。たとえば、

input="foo"
VAR="1"

case $input in
foo)
    if [ $VAR = "1" ]; then

        # perform fallthrough

    else

        # do not perform fallthrough

    fi
;;
*)
    echo "fallthrough worked!"
;;
esac

上記のコードで変数VARが 。1

答え1

あなたはできません。失敗を達成する方法は、区切り文字を(または)にcase置き換えることです。 ifに入れるのは構文エラーです。;;;&;;&

ロジック全体を一般的な条件付きで作成できます。

if [ "$input" != "foo" ] || [ "$VAR" = 1 ]; then
    one branch ...
else   # $input = "foo" && $VAR != 1
    another branch...
fi

答え2

$var次のスクリプトは最初にテストし、次に実行時に失敗したテストを「内外」に切り替えます(;&aで使用されます)。case$input

「fallthroughを実行する」かどうかに関する質問は、実際にはisか$inputどうかにかかっているので、私たちがこれを行うことです。もし他の値だったら、進めるか心配する必要もなかったでしょう。$var1

#/bin/bash

input='foo'
var='1'

case $var in
    1)
        case $input in
            foo)
                echo 'perform fallthrough'
                ;&
            *)
                echo 'fallthough worked'
        esac
        ;;
    *)
        echo 'what fallthrough?'
esac

または以下なしcase

if [ "$var" -eq 1 ]; then
    if [ "$input" = 'foo' ]; then
        echo 'perform fallthrough'
    fi
    echo 'fallthough worked'
else
    echo 'what fallthrough?'
fi

答え3

ロジックを再構成することをお勧めします。 「fallthrough」コードを関数に入れます。

fallthrough() { echo 'fallthrough worked!'; }

for input in foo bar; do
    for var in 1 2; do
        echo "$input $var"
        case $input in
            foo)
                if (( var == 1 )); then
                    echo "falling through"
                    fallthrough
                else
                    echo "not falling through"
                fi
            ;;
            *) fallthrough;;
        esac
    done
done

出力

foo 1
falling through
fallthrough worked!
foo 2
not falling through
bar 1
fallthrough worked!
bar 2
fallthrough worked!

答え4

テスト両方ワンタイム変数(bash 4.0-alpha+):

#!/bin/bash
while (($#>1)); do
    input=$1    VAR=$2
    echo "input=${input} VAR=${VAR}"; shift 2

    if [ "$VAR" = 1 ]; then new=1; else new=0; fi

    case $input$new in
    foo0)   echo "do not perform fallthrough"   ;;
    foo*)   echo "perform fallthrough"          ;&
    *)      echo "fallthrough worked!"          ;;
    esac

    echo
done

テスト情報:

$ ./script foo 0   foo 1   bar baz
input=foo VAR=0
do not perform fallthrough

input=foo VAR=1
perform fallthrough
fallthrough worked!

input=bar VAR=baz
fallthrough worked!

清潔でシンプルです。

テスト値($new)には2つの可能な値しかなければならないので、VARをブール値に変換するためにif句が存在する理由です。 VARをブール値に設定できる場合は、テストされて0(いいえ1case削除されますif

関連情報