Bash测试值评估

标签 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  ]] 

永远不会评估为真,如果我想获得想要的结果,我需要将测试更改为:

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/

相关文章:

bash - 在解锁时运行脚本?

macos - 在mac终端模拟键盘按下

linux - 在 shell 中,如何获取包含空格的每个参数

list - wshShell 和 WMIC 批量协同工作?

linux - 脚本不提取 tar

bash - 给定 IP 和网络掩码,如何使用 bash 计算网络地址?

linux - 将列表插入字符串

linux - 如何在不重启 Linux 服务器的情况下在 shell 脚本中重新加载环境变量

linux - 如何将 "tar"shell 命令翻译成 Python

python - 从 Python shell 中执行命令行或 R 脚本文件时出现问题