我正在学习 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 ]]
永远不会评估为真,如果我想获得想要的结果,我需要将测试更改为:
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" ]]
我还添加了一些引语:你真的应该在整件事中引用你的论点。
关于Bash测试值评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797575/