我无法进行数值比较:
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。
如何将数字转换为一种类型以进行真正的比较?
当前回答
在Bash中,您应该在算术上下文中进行检查:
if (( a > b )); then
...
fi
对于不支持(())的POSIX shell,可以使用-lt和-gt。
if [ "$a" -gt "$b" ]; then
...
fi
您可以通过帮助测试或人工测试获得比较运算符的完整列表。
其他回答
如果你想同时使用浮点数,括号(例如[[$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
如果您想检查数字变量(整数或非整数)是否在数字范围内,这很有用。
在Bash中,您应该在算术上下文中进行检查:
if (( a > b )); then
...
fi
对于不支持(())的POSIX shell,可以使用-lt和-gt。
if [ "$a" -gt "$b" ]; then
...
fi
您可以通过帮助测试或人工测试获得比较运算符的完整列表。
我通过使用一个小函数将版本字符串转换为可以比较的纯整数值来解决这个问题:
function versionToInt() {
local IFS=.
parts=($1)
let val=1000000*parts[0]+1000*parts[1]+parts[2]
echo $val
}
这有两个重要的假设:
输入是“正常SemVer字符串”每个零件在0-999之间
例如
versionToInt 12.34.56 # --> 12034056
versionToInt 1.2.3 # --> 1002003
测试npm命令是否满足最低要求的示例。。。
NPM_ACTUAL=$(versionToInt $(npm --version)) # Capture npm version
NPM_REQUIRED=$(versionToInt 4.3.0) # Desired version
if [ $NPM_ACTUAL \< $NPM_REQUIRED ]; then
echo "Please update to npm@latest"
exit 1
fi
这样地:
#!/bin/bash
a=2462620
b=2462620
if [ "$a" -eq "$b" ]; then
echo "They're equal";
fi
整数可以与以下运算符进行比较:
-eq # Equal
-ne # Not equal
-lt # Less than
-le # Less than or equal
-gt # Greater than
-ge # Greater than or equal
请参阅此备忘单。
除了以上所有答案之外:
如果在单个If语句中有多个表达式,可以执行以下操作:
if (( $a % 2 == 0 )) && (( $b % 2 != 0));
then
echo "What you want to do"
fi
希望这有帮助!