我试图从文件中获取输入并执行算术运算
#!/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;
任何人都可以帮我解决这个问题吗?
答案 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
...