Bash 读取每个文件的第一行并将其与参考号进行比较

Bash 读取每个文件的第一行并将其与参考号进行比较,bash,Bash,我有三个输入文件。我将读取每个输入文件的第一行,并将它们与参考号进行比较。从不同输入文件读取的所有值a1、a2和a3都应小于绝对参考值aref。我的脚本给出了参考值的错误:行..:-2.13:没有这样的文件或目录。如何修复我的代码?我的情况是否正确 #!/bin/bash -f a1=$(head -n 1 input1.xvg) a2=$(head -n 1 input2.xvg) a3=$(head -n 1 input3.xvg) aref=-2.13 if [a1 < $ar

我有三个输入文件。我将读取每个输入文件的第一行,并将它们与参考号进行比较。从不同输入文件读取的所有值a1、a2和a3都应小于绝对参考值aref。我的脚本给出了参考值的错误:行..:-2.13:没有这样的文件或目录。如何修复我的代码?我的情况是否正确

#!/bin/bash -f

a1=$(head -n 1 input1.xvg)
a2=$(head -n 1 input2.xvg)
a3=$(head -n 1 input3.xvg)

aref=-2.13

if [a1 < $aref && a2 < $aref && a3 < $aref] ; then

    echo "It's good"

else 

   echo "It isn't good"

fi

在if语句中使用[[而不是]。因为您使用的是[shell认为您在传递一个文件,而不是与值进行比较

试着这样写你的if

if [[ $a1 < $aref && $a2 > $aref && $a3 > $aref ]] ; then
要使用aref的绝对值,请使用以下命令:

let "aref=$aref<0?-$aref:$aref"

除了语法错误外,在测试中需要在[before]之后和[before]之间加空格,并且变量名中缺少一些$,看起来您正在尝试比较bash不支持的浮点数。一个选项是在算术上下文中使用bc:

if (( $(bc <<<"$a1 < $aref && $a2 > $aref && $a3 > $aref") )); then
    echo "It's good"
else
    echo "It isn't good"
fi
命令替换$…”的输出为1或0,具体取决于条件是否为真。如果输出为1,算术上下文…将返回成功;如果输出为0,则返回失败


如果希望使用变量的绝对值,一种方法是使用${a1-}、${aref-},等等。这将删除每个变量的前导-好的。但是我如何在if条件下设置绝对aref?这样,代码使用负aref值。现在可以了。Bash不理解浮点数,所以这种方法不起作用。是的,我没有注意aref的值。而且你的解释有误导性。这是完美的y使用标准[进行测试]是有效的-错误的原因是[和a1之间没有空格,因此shell尝试运行名为[a1]的命令,该命令不存在。使用[…]测试构造而不是[…]可以防止脚本中出现许多逻辑错误。例如,&&,| |操作符在[…]中工作测试,尽管在[]构造中给出了一个错误。@erhan这些数字被视为字符串,因此它们是否为浮点数无关紧要。如果数字为正数,则展开没有任何效果,因此它可以以任何方式工作。您尝试过吗?