我无法进行数值比较:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
问题是它比较了从第一位开始的数字,即9大于10,但1大于09。
如何将数字转换为一种类型以进行真正的比较?
我无法进行数值比较:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
问题是它比较了从第一位开始的数字,即9大于10,但1大于09。
如何将数字转换为一种类型以进行真正的比较?
当前回答
除了以上所有答案之外:
如果在单个If语句中有多个表达式,可以执行以下操作:
if (( $a % 2 == 0 )) && (( $b % 2 != 0));
then
echo "What you want to do"
fi
希望这有帮助!
其他回答
在Bash中,我更喜欢这样做,因为它更多地将自己作为一个条件操作来处理,而不是使用(()),后者更像是算术。
[[ n -gt m ]]
除非我做复杂的事情
(( (n + 1) > m ))
但每个人都有自己的喜好。可悲的是,有些人强加了他们的非官方标准。
您也可以这样做:
[[ 'n + 1' -gt m ]]
这允许你添加除算术以外的其他东西。
在Bash中,您应该在算术上下文中进行检查:
if (( a > b )); then
...
fi
对于不支持(())的POSIX shell,可以使用-lt和-gt。
if [ "$a" -gt "$b" ]; then
...
fi
您可以通过帮助测试或人工测试获得比较运算符的完整列表。
此代码还可以比较浮点数。它使用AWK(它不是纯Bash)。然而,这不应该是一个问题,因为AWK是一个标准的POSIX命令,很可能默认情况下随操作系统一起提供。
$ awk 'BEGIN {return_code=(-1.2345 == -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 >= -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 < -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
1
$ awk 'BEGIN {return_code=(-1.2345 < 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 > 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
要缩短使用时间,请使用以下功能:
compare_nums()
{
# Function to compare two numbers (float or integers) by using AWK.
# The function will not print anything, but it will return 0 (if the comparison is true) or 1
# (if the comparison is false) exit codes, so it can be used directly in shell one liners.
#############
### Usage ###
### Note that you have to enclose the comparison operator in quotes.
#############
# compare_nums 1 ">" 2 # returns false
# compare_nums 1.23 "<=" 2 # returns true
# compare_nums -1.238 "<=" -2 # returns false
#############################################
num1=$1
op=$2
num2=$3
E_BADARGS=65
# Make sure that the provided numbers are actually numbers.
if ! [[ $num1 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num1 is not a number"; return $E_BADARGS; fi
if ! [[ $num2 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num2 is not a number"; return $E_BADARGS; fi
# If you want to print the exit code as well (instead of only returning it), uncomment
# the awk line below and comment the uncommented one which is two lines below.
#awk 'BEGIN {print return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
awk 'BEGIN {return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
return_code=$?
return $return_code
}
$ compare_nums -1.2345 ">=" -1.2345 && echo true || echo false
true
$ compare_nums -1.2345 ">=" 23 && echo true || echo false
false
如果你想同时使用浮点数,括号(例如[[$a-gt$b]]或(($a>$b))是不够的;它将报告语法错误。如果要将浮点数或浮点数与整数进行比较,可以使用(($(bc<<“…”))。
例如
a=2.00
b=1
if (( $(bc <<<"$a > $b") )); then
echo "a is greater than b"
else
echo "a is not greater than b"
fi
您可以在if语句中包含多个比较。例如
a=2.
b=1
c=1.0000
if (( $(bc <<<"$b == $c && $b < $a") )); then
echo "b is equal to c but less than a"
else
echo "b is either not equal to c and/or not less than a"
fi
如果您想检查数字变量(整数或非整数)是否在数字范围内,这很有用。
除了以上所有答案之外:
如果在单个If语句中有多个表达式,可以执行以下操作:
if (( $a % 2 == 0 )) && (( $b % 2 != 0));
then
echo "What you want to do"
fi
希望这有帮助!