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

使用zsh,您可以j在应用 uoting 后添加元素q以生成数组的确定性字符串表示形式,然后您可以将其作为字符串进行比较,而无需typeset -p在子 shell 中运行:

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

相关内容