我想知道是否有任何方法可以同时处理多个变量,如下所示:
#/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