在bash shell中,我必须确定三个值是否彼此相等
if [val1 == val2 == val3]; then
do something
else
do other
fi
但它似乎不起作用(争论太多(我哪里做错了?谢谢Massimo
您只需要进行两次比较。
if [ "$val1" = "$val2" ] && [ "$val2" = "$val3" ]; then
do something
else
do other
fi
这利用了所有等价关系都是可传递的事实:如果val1 = val2
和val2 = val3
,那么val1 = val3
也必须为真。
因为我们可以做得更复杂:
declare -A a=( [a$var1]= [a$var2]= [a$var3]= )
if [[ "${#a[@]}" == 1 ]]; then echo equal; else echo not equal; fi
unset a
其思想是创建一个具有键值对的关联数组a
。在上面的例子中,值总是一个空字符串,所以我们只关心键。上面的密钥是a$var1
、a$var2
和a$var3
。如果这些键中有任何一个是相同的,那么就好像我们只定义了一个键。即
declare -A a ( [aa]= [ab]= [aa]= )
相当于
declare -A a ( [aa]= [ab]= )
值${#a[@]}
返回数组中的条目总数。因此,如果这等于1,就意味着所有的值都是相同的。
我们在键前面加一个字符(这里是a
(,以确保变量可以是任何东西,包括空字符串@
和*
。感谢伊凡指出这一点。
让我们再次同意1定律,如果a=b
和b=c
,那么它将是a=b=c
。考虑到尝试将您的条件更改为(BTW IMHO,我不认为bash允许a==b==c
类型if条件,而Python允许,如果我在这里是正确的(:
if [[ "$val1" -eq "$val2" && "$val2" -eq "$val3" ]]
then
do something
else
do other
fi
运行示例:
假设我们有以下脚本,其中包含3个变量值:
$ cat script.bash
#!/bin/bash
val1="1"
val2="1"
val3="1"
if [[ "$val1" -eq "$val2" && "$val2" -eq "$val3" ]]
then
echo "do something"
else
echo "do other"
fi
现在,当我们将其运行为:
$ ./script.bash
do something
如果所有值都是数字,这可能会起作用(而不是(
$ val1=1 val2=1 val3=1
$ ((val1==val2==val3)) && echo ok || echo fail
ok
$ val1=1 val2=2 val3=1
$ ((val1==val2==val3)) && echo ok || echo fail
fail
然后像这个
$ val1=3 val2=3 val3=3
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
ok
$ val1=3 val2=3 val3=a2
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
fail
$ val1=asdlkjm2354l val2=$val1 val3=$val1
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
ok
$ val1=asdlkjm2354l val2=$val1 val3='sdf;lkjsdfs235lk;4j25'
$ [[ "$val1 $val1" == "$val2 $val3" ]] && echo ok || echo fail
fail
使用(())
也可以使用
$ val1=3 val2=3 val3=3
$ (($val1$val1==$val2$val3)) && echo ok || echo fail
ok
$ val1=33 val2=3 val3=33
$ (($val1$val1==$val2$val3)) && echo ok || echo fail
fail