Bash脚本中的标准输入错误

11

我有两个几乎相同的bash脚本,一个可以正常工作,而另一个则不能,我无法弄清楚发生了什么。以下是这两个脚本:

这个可以正常工作:

#!/bin/bash

CURDIR=$HOME/Documents/Development/road/Earthmoving
TOL=0.05

echo -e "\nRunning Unit Tests"
echo -e "------------------\n"

for infile in $CURDIR/utest/*.csv
do
    file=$(basename $infile .csv)
    echo -n " Test $file"
    value=`$CURDIR/Release/earthmove -f $infile`
    res=`cat $CURDIR/utest/$file.res`
    if [ "$(echo "$res+$TOL*$res >= $value && $res-$TOL*$res <= $value" | bc)" -eq 1 ]; then
    echo -e "\t\t PASSED."
    else
    echo -e "\t\t FAILED."
    fi;
done

echo ""

但是这个会给我各种错误:
#!/bin/bash

CURDIR=$HOME/Documents/Development/road/Vertical
TOL=0.05

echo -e "\nRunning Unit Tests"
echo -e "------------------\n"

for infile in $CURDIR/utest/*.csv
do
    file=$(basename $infile .csv)
    echo -n " Test $file"
    value=`$CURDIR/Release/vertical -f $infile`
    res=`cat $CURDIR/utest/$file.res`
    if [ "$(echo "$res+$TOL*$res >= $value && $res-$TOL*$res <= $value" | bc)" -eq 1 ]; then
    echo -e "\t\t PASSED."
    else
    echo -e "\t\t FAILED."
    fi;
done

echo ""

除了文件夹名称(Earthmoving 和 Vertical)和程序名称(earthmove 和 vertical)之外,这两个文件是完全相同的。我知道这一点是因为我通过复制和粘贴第一个文件创建了第二个文件。运行第二个脚本会导致以下结果:
Running Unit Tests
------------------

 Test flatroad(standard_in) 1: illegal character: S
(standard_in) 1: syntax error
(standard_in) 1: illegal character: :
(standard_in) 2: illegal character: S
(standard_in) 2: illegal character: :
(standard_in) 2: syntax error
(standard_in) 2: illegal character: N
(standard_in) 2: illegal character: :
(standard_in) 2: illegal character: I
(standard_in) 2: illegal character: :
(standard_in) 2: illegal character: :
(standard_in) 2: illegal character: O
(standard_in) 2: illegal character: :
(standard_in) 3: illegal character: P
(standard_in) 3: illegal character: :
(standard_in) 3: syntax error
(standard_in) 3: illegal character: M
(standard_in) 3: illegal character: :
(standard_in) 3: illegal character: H
(standard_in) 3: illegal character: :
(standard_in) 3: illegal character: :
(standard_in) 4: illegal character: P
(standard_in) 4: illegal character: :
(standard_in) 4: syntax error
(standard_in) 4: illegal character: M
(standard_in) 4: illegal character: :
(standard_in) 4: illegal character: H
(standard_in) 4: illegal character: :
(standard_in) 4: illegal character: :
(standard_in) 5: syntax error
(standard_in) 5: illegal character: :
(standard_in) 6: illegal character: P
(standard_in) 6: illegal character: :
(standard_in) 6: illegal character: M
(standard_in) 6: syntax error
(standard_in) 6: illegal character: :
(standard_in) 7: syntax error
(standard_in) 7: illegal character: :
(standard_in) 8: illegal character: P
(standard_in) 8: illegal character: :
(standard_in) 8: syntax error
(standard_in) 8: illegal character: M
(standard_in) 8: illegal character: :
(standard_in) 15: syntax error
(standard_in) 16: syntax error
(standard_in) 16: illegal character: M
(standard_in) 16: illegal character: I
(standard_in) 16: illegal character: P
(standard_in) 17: syntax error
(standard_in) 18: illegal character: T
(standard_in) 18: illegal character: S
(standard_in) 18: illegal character: T
(standard_in) 18: syntax error
(standard_in) 19: illegal character: T
(standard_in) 19: illegal character: S
(standard_in) 19: illegal character: T
(standard_in) 19: syntax error
(standard_in) 20: illegal character: T
(standard_in) 20: illegal character: S
(standard_in) 20: illegal character: T
(standard_in) 20: syntax error
(standard_in) 21: illegal character: T
.
.
.
(standard_in) 90: illegal character: I
(standard_in) 90: illegal character: O
(standard_in) 90: syntax error
(standard_in) 90: illegal character: P
(standard_in) 90: illegal character: I
(standard_in) 90: illegal character: I
(standard_in) 90: illegal character: T
(standard_in) 91: syntax error
(standard_in) 91: syntax error
(standard_in) 91: syntax error
(standard_in) 91: syntax error
(standard_in) 93: illegal character: S
(standard_in) 93: syntax error
(standard_in) 94: illegal character: O
(standard_in) 94: syntax error
(standard_in) 95: syntax error
(standard_in) 96: illegal character: U
(standard_in) 96: syntax error
(standard_in) 96: illegal character: '
(standard_in) 96: illegal character: O
(standard_in) 96: illegal character: '
                 FAILED.

在“…”处还有很多行,但它们基本上只是同一想法的变化。


什么是 vertical?什么是 earthmove - wilhelmtell
你能够单独运行 $CURDIR/Release/vertical 并使用 flatroad 文件吗?这样会产生完全相同的错误吗? - Richard Fearn
vertical和earthmove是两个C++程序。是的,从命令行运行"vertical -f flatroad.csv"可以正常工作。 - Jessica
3个回答

12

错误消息由bc生成。问题在于文件“$ HOME / Documents / Development / road / Vertical / utest / $ file.res”中存在类似“S:S:N:I :: O:P ...”的内容,而相应的文件在另一个脚本中使用时不存在。很有可能您期望该文件包含单个数字值,而不是现在存在的任何内容。


flatroad.res(目录中唯一的.res文件)仅包含“0.0”(不含引号),这是一个单一的数字值。 - Jessica
1
@Jessica:那么$value的值包含了bc无法理解的内容。 - Dennis Williamson

0

(standard_in) 1: syntax error

使用perl命令代替bc命令可以解决这个错误,

$(perl -e "print $b+$c")


0

检查垂直目录的内容。你的CSV文件名中是否有空格或奇怪的字符?尝试用引号括起来包含文件名的变量:

"\"${filename}\""

当前在Vertical/utest目录中的唯一文件是flatroad.csv和flatroad.res。我尝试了你的建议,除了所有其他错误之外,现在我还遇到了以下问题:“测试flatroad.csv”cat: /home/jessica/Documents/Development/road/Vertical/utest/flatroad.csv".res: 没有这个文件或目录” - Jessica
/home/jessica/Documents/Development/road/Vertical/utest 目录下有哪些文件?同时尝试在 bash 中打开详细模式:$ set -v你可以使用 "set +v" 关闭它。 - pborenstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接