我正在尝试编写一个读取三个整数的脚本,然后检查这些数字中任意两个的总和是否大于第三个。如果这是真的,那么它检查这些数字是否相等,并打印一条消息。如果没有,它会检查是否有两个数字相等并打印另一条消息。如果上述所有内容均为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
How to represent multiple conditions in a shell if statement?
但是我没有找到任何覆盖算术运算符的条件。 谁能告诉我什么是正确的方法?
<编辑:编辑:我忘了在原帖中提到我是bash的新手,所以请原谅我可能犯的任何重大错误。我仍在试图弄清楚事情是如何运作的。)答案 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);