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