if语句中的算术,比较和常规运算符的多个条件

时间:2017-04-23 15:51:29

标签: bash shell if-statement scripting

我正在尝试编写一个读取三个整数的脚本,然后检查这些数字中任意两个的总和是否大于第三个。如果这是真的,那么它检查这些数字是否相等,并打印一条消息。如果没有,它会检查是否有两个数字相等并打印另一条消息。如果上述所有内容均为false,则会显示一条消息,指出所有数字都不同。 我试图将其放在以下嵌套条件中:

read X
read Y
read Z
if [ $X + $Y > $Z ] && [ $X + $Z > $Y ] && [ $Y + $Z > $X ]
then
    if [ $X = $Y = $Z ]
    then
        echo "All numbers are equal."
    elif [ [ $X = $Y ] && [ $X != $Z ] ] || [ [ $X = $Z ] && [ $X != $Y ] ] || [ [ $Z = $Y ] && [ $X != $Y ] ]
    then
        echo "Two of the numbers are equal."
    else
        echo "None of the numbers is equal to another."
    fi
fi

我尝试了所有类型的括号和括号组合(上面只是其中之一),但到目前为止它们都没有。 我已经看了相关的帖子:

Bash if statement with multiple conditions throws an error

Bash: Two conditions in if

How to represent multiple conditions in a shell if statement?

但是我没有找到任何覆盖算术运算符的条件。 谁能告诉我什么是正确的方法?

<编辑:编辑:我忘了在原帖中提到我是bash的新手,所以请原谅我可能犯的任何重大错误。我仍在试图弄清楚事情是如何运作的。)

4 个答案:

答案 0 :(得分:3)

这是Inian的答案的变体,利用算术运算不需要$扩展变量,接受逻辑运算符,以及所有数字相等的第一次测试允许简化以下测试

请注意,检查实际读取的值是否为整数是一个好主意,以避免意外行为。

#!/bin/bash
read X
read Y
read Z
if
  (( X+Y>Z || X+Z>Y || Y+Z>X ))
then
  if
    (( X==Y && Y==Z ))
  then
      echo "All numbers are equal"
  elif
    (( X==Y || X==Z || Z==Y ))
  then
    echo "Two of the numbers are equal"
  else
    echo "All three numbers are different"
  fi
fi

算术表达式的$(( )) for扩展为对里面找到的表达式求值的结果。 (( ))用作命令,如果表达式是导致“true”值的测试或者如果计算结果为非零数字,则返回0,否则返回非零值。第二种形式对测试非常有用。

另外,我喜欢使用(( ))的属性来处理脚本中的开/关选项。例如,如果变量为null或0,则((state_variable))将评估为“false”,否则将评估为“true”,这将很好地映射到如此直观地预期这样的变量的行为。

答案 1 :(得分:2)

您也可以通过增加匹配和使用case语句以不同的方式执行此操作。

也可以使用更多变量更容易扩展。

#!/bin/bash

read X
read Y
read Z

((Matches+=(X==Y)))
((Matches+=(Y==Z)))
((Matches+=(X==Z)))

case "$Matches" in

0) echo "None of the numbers is equal to another.";;
1) echo "Two of the numbers are equal.";;
3) echo "All numbers are equal.";;

esac

答案 2 :(得分:1)

解决问题的完全不同的方法。

#!/bin/bash

declare -A a               # declare associative array a

read x; a[$x]=$x
read x; a[$x]=$x
read x; a[$x]=$x

case ${#a[@]} in
  1) echo "All numbers are equal." ;;
  2) echo "Two of the numbers are equal." ;;
  3) echo "None of the numbers is equal to another." ;;
esac

答案 3 :(得分:1)

单行函数,从123's answer浓缩:

3a 1 1 1 ; 3a 1 1 2 ; 3a 1 2 3
All numbers are equal.
Two numbers are equal.
No numbers are equal.

显示所有三种情况:

function [B] = AutoCorrelation()
img = imread('F:\\2dAutocorrelationFunction\\New_folder\\1.bmp');
img2 = rgb2gray(img);
[n m]=size(img2);
B=abs(fftshift(ifft2(fft2(img2).*conj(fft2(img2)))))./(n*m);