shell:将整数除法结果写入变量并打印浮点数

shell:将整数除法结果写入变量并打印浮点数,shell,unix,math,Shell,Unix,Math,我正在尝试编写一个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)

我正在尝试编写一个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

但两者都不起作用。错误消息是:

(standard_in) 1: syntax error

有人知道怎么做吗?非常感谢

输出到文件,而不是变量。为此,您需要
var=$(命令)
。因此,这应该是:

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
应为文件名。否则,请指出它。

您将输出到文件,而不是VAR。为此,您需要
var=$(命令)
。因此,这应该是:

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
应为文件名。否则,请指出它。

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

score=$(echo "scale=4; /" | bc)
这是错误的(语法错误源于此)

然后,
$variable3
$variable4
也会出现同样的问题。他们有价值吗?你给他们分配了类似的任务吗

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

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

  var=$(command)


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

score=$(echo "scale=4; /" | bc)
这是错误的(语法错误源于此)

然后,
$variable3
$variable4
也会出现同样的问题。他们有价值吗?你给他们分配了类似的任务吗

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

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

  var=$(command)


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

score=$(awk 'NR==FNR {a+=$5; next} {b+=$5} END {printf "%.4f", a/b}' $variable1 $variable2)
这是假设
$variable1
$variable2
是有效的文件名


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

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

score=$(awk 'NR==FNR {a+=$5; next} {b+=$5} END {printf "%.4f", a/b}' $variable1 $variable2)
这是假设
$variable1
$variable2
是有效的文件名


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

您是否打算从变量
$variable1
中命名的文件中读取
awk
?你真的想把awk脚本的输出放到一个名为
casenum
的文件中,这个文件恰好是你在echo中使用的变量的名称吗?我怀疑您的问题主要是由于对基本shell语法的混淆造成的。确切地说,fedorqui的回答也提到了同样的问题。谢谢您是否打算让
awk
从变量
$variable1
中命名的文件中读取?你真的想把awk脚本的输出放到一个名为
casenum
的文件中,这个文件恰好是你在echo中使用的变量的名称吗?我怀疑您的问题主要是由于对基本shell语法的混淆造成的。确切地说,fedorqui的回答也提到了同样的问题。谢谢$variable1和$variable2是脚本中的变量。他们工作得很好。你会怎么做来表示它?你是什么意思,@user2157668?我的意思是,使用的变量似乎是文件名,如果不是这样,那么我必须知道它们背后的逻辑才能理解它。顺便说一句,既然你是新来的,如果你的问题已经解决了,请别忘了把答案标为“接受”。您可以点击答案旁边的复选标记,将答案从空心切换为绿色。看看你是否有任何疑问!我懂了。为了简单起见,我没有包括前面的几行。它们被用作变量。我刚刚接受了!很好,现在我明白了,@user2157668:)$variable1和$variable2是我脚本中的变量。他们工作得很好。你会怎么做来表示它?你是什么意思,@user2157668?我的意思是,使用的变量似乎是文件名,如果不是这样,那么我必须知道它们背后的逻辑才能理解它。顺便说一句,既然你是新来的,如果你的问题已经解决了,请别忘了把答案标为“接受”。您可以点击答案旁边的复选标记,将答案从空心切换为绿色。看看你是否有任何疑问!我懂了。为了简单起见,我没有包括前面的几行。它们被用作变量。我刚刚接受了!太好了,n