为什么这个bash脚本总是计算为false

为什么这个bash脚本总是计算为false,bash,sh,Bash,Sh,我正在尝试我的第一个bash脚本,只是为了通过另一个脚本运行一些文件并检查答案 for i in tests/*; do if [ "${i: -2}" != ".a" ] ; then A=`cat "$i" | python3 blah.py` B=`cat "$i.a"` if (("$A" == "$B")); then printf "Passed $i\n\n" else echo "Failed $i:" ec

我正在尝试我的第一个bash脚本,只是为了通过另一个脚本运行一些文件并检查答案

for i in tests/*;
do
  if [ "${i: -2}" != ".a" ] ; then
    A=`cat "$i" | python3 blah.py`
    B=`cat "$i.a"`
    if (("$A" == "$B")); then
      printf "Passed $i\n\n"
    else
      echo "Failed $i:"
      echo "Calculated Answer: $A"
      printf "   Correct Answer: $B\n\n"
    fi
  fi
done
无论我如何处理这个脚本,我都会得到如下输出:

Failed tests/23:
Calculated Answer: 33334
   Correct Answer: 33334

其中,我的计算答案将与给定答案相同,但脚本将显示我失败。

对我有效,因此可能是您的bash版本,请小心。我在OSX上:

bash --version
> GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
> Copyright (C) 2007 Free Software Foundation, Inc.
A="1"
B="1"
if (("$A" == "$B")); then
    printf "Passed $i\n\n"
else
    echo "Failed $i:"
    echo "Calculated Answer: $A"
    printf "   Correct Answer: $B\n\n"
fi
> Passed
A="1"
B="2"
if (("$A" == "$B")); then
    printf "Passed $i\n\n"
else
    echo "Failed $i:"
    echo "Calculated Answer: $A"
    printf "   Correct Answer: $B\n\n"
fi
> Failed :
>    Calculated Answer: 1
>    Correct Answer: 2
其中最突出的是巴拉那人。我通常不使用()表示if,只使用[]或[](语句中的空格很重要)。如果我只使用[],我不知道它什么时候重要,因为它可能向后兼容旧的/bin/sh环境。但是试着替换它们。还有,printf?老实说,我不知道你能用它,我总是用echo.:)哦,好吧,它起作用了:

if [[ "$A" == "$B" ]]; then
    printf "Passed $i\n\n"
else
    echo "Failed $i:"
    echo "Calculated Answer: $A"
    printf "   Correct Answer: $B\n\n"
fi

试试上面的方法,让我们知道您使用的是哪个版本的bash/sh/other解释器。

其中可能有一些非打印字符。试着通过
hextump
或类似的方式将输出管道化,看看是否发生了这种情况。
printf
肯定比
echo
更受欢迎,因为它定义明确且标准化。圆括号专门用于算术计算
[
是通用的可移植
测试,而
[[
是Bash扩展。