2017-06-01 135 views
0

我遇到了bc命令的问题。产生的输出是:语法错误Bash命令bc

(standard_in) 2: syntax error 

在这里我发布我的代码,任何建议将不胜感激。

value="100%"   # the threshold to cause a break out 
kb="kB/s" 
mb="MB/s"    # strings to mask out 
conversor=1024  # kb->mb conversion 
contador=0   # initalize our total in megabytes 
for ((x=3; x<=${#array[@]}; x+=5)); do 
    paraula=${array[$x]}; 

    if [[ $paraula =~ .*kB.* ]]; then 
     paraula=${paraula%$kb} 
     paraula=$(echo "scale=4; $paraula/$conversor" | bc) # convert to $mb 
     contador=$(echo "scale=4; $contador+$paraula" | bc) 
     echo "Counting: "$contador 
    else 
     paraula=${paraula%$mb} 
     contador=$(echo "scale=4; $contador+$paraula" | bc) 
     echo "Counting: "$contador 
    fi 

    if [[ " ${array[$x]} " =~ " $value " ]]; then 
     break; 
    fi 
    echo "Value : ${array[$x]} "; 

done 

echo "final value: $contador" 

然后,终端上的错误执行脚本后

error

+1

你可以简化成[mcve]吗?你可能会从一行代码中得到同样的错误,它只会调用'bc'。 –

+0

考虑使用'bash -x yourscript'来记录脚本所做的一切,找到它首先出错的地方。如果您希望跟踪更容易一些,您可以将值分配给包含行号的“PS4”;例如,你可以运行一行:'PS4 =':$ {LINENO} +'bash -x yourscript'。 (请注意,出于安全考虑,如果该脚本以root用户身份运行,则必须在脚本本身内设置PS4')。 –

+0

顺便说一句,请添加上述请求的日志作为文本的问题,而不是截图。看到接受的答案[为什么不要在提问时上传代码的图像?](https://meta.stackoverflow.com/a/285557/14122) –

回答

0

的问题是你的最后一行没有在它换行,当通过管道输送到BC。

这工作正常。

$ echo "scale=4; 2046/1024" | bc 
1.9980 
$ echo -e "scale=4; 2046/1024\n" | bc 
1.9980 

这是打破

$ echo -n "scale=4; 2046/1024" | bc 
(standard_in) 1: syntax error 

我想你可以改变

contador=$(echo -e "scale=4; $contador+$paraulao\n" | bc) 

这应该修复它。此外,缩进并添加注释。

+0

'-e'选项是不必要的(我*希望*没有任何应该是数字的转义字符)。 – chepner

+0

@chepner \ n需要'-e'。 – SaintHax

+0

为什么使用非标准的'-e'选项来隐藏隐含的换行符只是为了明确地添加它? – chepner