我正在学习关于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
,也就是真,那么为什么需要反转它们才能让脚本按照我的意愿工作呢?谢谢您的帮助。
set -x
或在第一行的 shebang 中添加-x
:#!/bin/bash -x
。这将让您看到每一行代码的执行情况。 - Harvey