私は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
どうかにかかっているので、私たちがこれを行うことです。もし他の値だったら、進めるか心配する必要もなかったでしょう。$var
1
#/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
(いいえ1
)case
削除されますif
。