我正在学习shell脚本,特别是shell命令test[ ][[ ]](( )),我编写了一个真正简单的脚本来测试我的理解,它接受三个参数,如果这三个参数都是整数(并且第二个参数低于第三个),它将测试第一个参数是否位于第二个和第三个参数之间的范围内这里是:

#!/bin/bash
#test if arg1 is contained in the range [arg2, arg3]

function isint()
{
    if [[ "$1" =~ ^-?[0-9]+$ ]]; then
    echo $1 is integer
    return 0
    else
    echo $1 is not integer
    return 1
    fi
}


if [[ $(isint $1) && $(isint $2) && $(isint $3) &&  $2 -lt $3  ]]; then
    if [[ $2 -le $1  &&  $1 -le $3 ]]; then
    echo "$1 is in the range [$2,$3]"
    else
    echo "$1 is not in the range [$2,$3]"
    fi
else
    echo usage: $0 INT1 INT2 INT3
fi

我的问题是:前面的脚本不起作用
if [[ $(isint $1) && $(isint $2) && $(isint $3) &&  $2 -lt $3  ]]

从不求值为true,如果要获得所需的结果,则需要将测试更改为:
if [[ !$(isint $1) && !$(isint $2) && !$(isint $3) &&  $2 -lt $3  ]]

我不明白为什么这样做,我理解test[[ ]]命令的方式是,它们都对传递给它们的表达式求值,0求值为true,1求值为false。在我的例子中,如果将正确的参数传递给脚本,isint调用的值为0,因此为真,为什么需要反转它们,脚本才能按我的要求工作?
提前谢谢你。

最佳答案

您的问题是$()包含您对isint的调用。它们将命令替换为对isint调用的标准输出,因此在本例中,您真正运行的是:

if [[ "$1 is integer" && "$2 is integer" && "$3 is integer" &&  $2 -lt $3  ]]

您希望使用返回值,所以只需删除$()并将isint从括号中移出即可:
if isint "$1" && isint "$2" && isint "$3" &&  [[ "$2" -lt "$3"  ]]

我还加了一些引语:你真的应该把你的论点引述到整个过程中。

10-05 19:28