Bashは同時に複数の変数を処理します。

Bashは同時に複数の変数を処理します。

次のように複数の変数を同時に処理する方法があるかどうか疑問に思います。

#/bin/bash
arr1=(1 2)
arr2=(3 4)
foo=1
bar=2

case $foo && $bar in
    ${arr1[@]})
        echo "variables equal array 1!";;
    ${arr2[@]})
        echo "variables equal array 2!";;
    *)
        echo "variables do not exactly equal any array!";;
esac

$foo合計$bar自体を配列に入れたくありませんが、必要な場合はそうすることができます。

答え1

IFSデフォルト値が変更されていないとします。

case "$foo $bar" in
"${arr1[*]}") echo "variables equal array 1!" ;;
"${arr2[*]}") echo "variables equal array 2!" ;;
*) echo "variables do not exactly equal any array!" ;;
esac

これは、各配列に格納されている個々の値に区切り文字(スペース)がない場合にのみ信頼できます。

答え2

まず、配列変数について心配しません。

次に、変数に表示されない限り、必要な区切り文字を使用できます。私は「/」をたくさん使っています。

それは次のとおりです。

case "$foo"/"$bar" in
(1/2) echo variables equal to first pattern\! ;;
(3/4) echo variables equal to second pattern\! ;;
(*) echo variables match no pattern. ;;
esac

また、次のワイルドカードエントリをかなり簡単に作成できます。

(1??/2??) echo variables are similar to the first pattern, but bigger\! ;;

パターンの順序が重要であり(最初の一致が勝つ)、値に区切り文字が表示されないことを忘れないでください。

また、最初のパターンを作成する場合は、(*/*/*)値に区切り文字が表示されるかどうかをテストできます。

答え3

typeset -p配列同等比較の出力を比較できます。

case $(a=("$foo" "$bar"); typeset -p a) in
  ("$(a=("${arr1[@]}"); typeset -p a)") ...;;
  ("$(a=("${arr2[@]}"); typeset -p a)") ...;;
esac

を使用すると、uotingを適用した後に要素を追加して配列の決定的な文字列表現を生成し、サブシェルでzsh実行せずに文字列と比較できます。jqtypeset -p

case "${(q)foo} ${(q)bar}" in
  (${(j[ ])${(q)arr1}}) ...;;
  (${(j[ ])${(q)arr2}}) ...;;
esac

関連情報