Bash测试值评估

时间:2017-10-17 19:14:29

标签: bash shell

我正在学习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,那么为什么需要反转它们让脚本按我的意愿工作?

提前谢谢。

2 个答案:

答案 0 :(得分:4)

您的问题是$(),其中包含您对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"  ]]

我还添加了一些引号:你真的应该在整个事情中引用你的论点。

答案 1 :(得分:4)

您将文字值与返回码混合在一起。它应该是这样的:

isint "$1" && isint "$2" && isint "$3" && [[ "$2" -lt "$3"  ]]

那就是说,运行这四个命令,看看它们是否都是真的(返回代码== 0)。