0

我正在尝试编写一个 shell 脚本并计划使用脚本中的两个变量来计算一个简单的除法。我无法让它工作。这是某种语法错误。

这是我的代码的一部分,名为 test.sh

    awk '{a+=$5} END {print a}' $variable1 > casenum
    awk '{a+=$5} END {print a}' $variable2 > controlnum
    score=$(echo "scale=4; $casenum/$controlnum" | bc)
    printf "%s\t%s\t%.4f\n", $variable3 $variable4 $score

只是 $score 不起作用。

我尝试使用

sh test.sh

或者

bash test.sh

但都没有奏效。错误信息是:

(standard_in) 1: syntax error

有谁知道如何使它工作?非常感谢!

4

3 回答 3

2

您正在输出到文件,而不是 vars。为此,您需要var=$(command). 因此,这应该使它:

casenum=$(awk '{a+=$5} END {print a}' $variable1)
controlnum=$(awk '{a+=$5} END {print a}' $variable2)
score=$(echo "scale=4; $casenum/$controlnum" | bc)
printf "%s\t%s\t%.4f\n", $variable3 $variable4 $score

注意$variable1$variable2应该是文件名。否则,请注明。

于 2013-10-29T14:31:10.603 回答
1

首先$variable1,您$variable2必须扩展为现有文件的名称;但这不是语法错误,这只是使您的代码出错的事实,除非您真的要处理包含数字的文件并将第五个字段的总和累积到文件中。由于casenumcontrolnum没有被分配(实际上您将 awk 结果写入文件,而不是变量),因此您的分数计算扩展到

score=$(echo "scale=4; /" | bc)

这是错误的(语法错误来自此)。

$variable3然后,与和相同的问题$variable4。他们持有价值吗?你有没有给他们分配类似的东西

  variable=...

? 否则它们将扩展为“”。修复这些(包括分配 casenum 和 controlnum)将修复所有问题,因为基本上唯一的语法错误是当 bc 尝试解释/没有操作数的命令时。(并且不需要 printf 后面的逗号)。

将命令执行的输出分配给变量的方式是

  var=$(command)

或者

  var=`command`
于 2013-10-29T14:44:15.580 回答
1

如果我正确理解您的命令,您可以将分数计算与单个awk语句结合起来,如下所示

score=$(awk 'NR==FNR {a+=$5; next} {b+=$5} END {printf "%.4f", a/b}' $variable1 $variable2)

这是假设$variable1并且$variable2是有效的文件名

如果您想坚持使用 2 awk 和 1 bc 的方法,请参阅@fedorqui的解决方案。

于 2013-10-29T14:46:15.353 回答