3个值之间的比较



在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 = val2val2 = 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$var1a$var2a$var3。如果这些键中有任何一个是相同的,那么就好像我们只定义了一个键。即

 declare -A a ( [aa]= [ab]= [aa]= )

相当于

 declare -A a ( [aa]= [ab]= )

${#a[@]}返回数组中的条目总数。因此,如果这等于1,就意味着所有的值都是相同的。

我们在键前面加一个字符(这里是a(,以确保变量可以是任何东西,包括空字符串@*。感谢伊凡指出这一点。

让我们再次同意1定律,如果a=bb=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

相关内容

  • 没有找到相关文章

最新更新