我无法进行数值比较:

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。

如何将数字转换为一种类型以进行真正的比较?


当前回答

我通过使用一个小函数将版本字符串转换为可以比较的纯整数值来解决这个问题:

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

其他回答

单线解决方案。

a=2
b=1
[[ ${a} -gt ${b} ]] && echo "true" || echo "false"

gt参考:https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html

&&参考:https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html

[[…]]构造引用:https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b

${}引用:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 (2.6.2)

参数展开格式如下:${表达式}其中表达式由匹配的“}”之前的所有字符组成。由或在带引号的字符串中转义的任何“}”,以及嵌入式算术扩展、命令替换、,在确定匹配“}”。参数展开的最简单形式是:${参数}

如果你想同时使用浮点数,括号(例如[[$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

您可以通过帮助测试或人工测试获得比较运算符的完整列表。

这样地:

#!/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

请参阅此备忘单。

在Bash中,我更喜欢这样做,因为它更多地将自己作为一个条件操作来处理,而不是使用(()),后者更像是算术。

[[ n -gt m ]]

除非我做复杂的事情

(( (n + 1) > m ))

但每个人都有自己的喜好。可悲的是,有些人强加了他们的非官方标准。

您也可以这样做:

[[ 'n + 1' -gt m ]]

这允许你添加除算术以外的其他东西。