这是:
3.8.13-68.3.4.el6uek.x86_64 #2 SMP Tue Jul 14 15:03:36 PDT 2015 x86_64 x86_64 x86_64 GNU/Linux
bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
我熟悉以下语法:
[ $VAR = "iotools" ] || [ $VAR_2 = "iotools" ]
其中要么$VAR
应该包含 valueiotools
要么$VAR_2
应该包含 value iotools
。
有没有一种方法可以像下面这样写:
[ $VAR||$VAR_2 = "iotools" ]
这个想法是为了节省代码占用的空间并消除第二对方括号中的额外代码。
答案1
不,您不能缩短比较的左侧。但是,您可以在右侧使用模式:
[[ iotools == @("$VAR"|"$VAR_2") ]]
请注意,您需要使用[[ ... ]]
而不是[ ... ]
它才能工作。看模式匹配了解man bash
详细信息。
应将变量加引号以防止VAR='a|iotools|b'
匹配。
答案2
由于您使用的是 bash,因此可以使用两个概念来完成:
有一种方法可以列出多个具有相似名称的变量:
VAR=iotools VAR_2=tools2 VAR_3=othertools printf '<%s> ' "${!VAR@}"
将打印:
<VAR> <VAR_2> <VAR_3>
这也可以间接完成
${!var}
(var 是与 $VAR 不同的变量):for var in "${!VAR@}"; do printf '<%s> ' "${!var}" done
将打印:
<iotools> <tools2> <othertools>
全部加在一起将是:
#!/bin/bash
VAR=iotools
VAR_2=tools2
VAR_3=othertools
testvalue="$1"
for var in "${!VAR@}"; do
if [[ ${!var} == $testvalue ]]; then
echo "Some value matched"
break
fi
done
调用如下:
$ script iotools
Some value matched
$ script notool
$