从文件中获取输入并使用bash命令执行添加

时间:2017-02-08 12:57:20

标签: bash unix text-files

我试图从文件中获取输入并执行算术运算

#!/bin/bash
INPUT=menu.txt
IFS=","
[ ! -f $INPUT ] &while read ch ch1 menu rate quantity 
do
echo "Choice : $ch"
echo "Choice of menu : $ch1"
echo "menu : $menu"
echo "price : $rate"
echo "quantity : $quantity"
echo "$(($rate * $quantity))" 
done < $INPUT

执行此代码时会抛出错误

  

选择:蔬菜       菜单选择:汤       菜单:玉米汤
      价格:160
      数量:1
      &#34;)语法错误:无效算术运算符(错误标记为&#34;

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

最有可能是因为浮点运算。我假设rate变量是一个浮点数。因此你需要这个:

echo "$rate * $quantity" | bc

答案 1 :(得分:0)

从内而外的错误消息中,我猜你的menu.txt文件是DOS / Windows格式,这意味着每一行以回车和换行结束。像bash这样的Unix工具希望行只用换行符(文本文件的unix格式)结束,因此将回车字符视为行的一部分。在您的脚本中,这意味着变量quantity中包含一个数字和一个回车,并且回车意味着它不是有效数字,并导致错误。

有几种方法可以解决这个问题。您可以在menu.txt文件上运行dos2unix(或类似的程序)。或者,您也可以使脚本修剪回车;一种方法是将回车符添加到IFS,因此read命令会将其视为空格并修剪它。顺便说一下,最好这样做(以及将#34;,#34;分配给IFS)作为read命令的前缀,这样它们只能 适用于那个命令,并且不会在其他地方弄乱:

[ ! -f $INPUT ] &while IFS=$',\r' read ch ch1 menu rate quantity

此外,该测试对我来说很落后。如果输入文件不存在,您真的想要运行循环吗?使用&会使其难以阅读;最好使用显式if(并引用变量引用),如下所示:

if [ -f "$INPUT" ]; then
    while IFS=$',\r' read ch ch1 menu rate quantity; do
        ...