使用shell脚本添加整数不起作用?

时间:2013-10-08 15:35:28

标签: bash shell unix

我有脚本文件。

for file in *.TXT
do
    amount=$(less $file | grep BPR | awk -F'CACH' '{c=$1;sub(/[^0-9]*/,"",c);total+=c/100}END{printf "%.2f", total}')
     totalAmount=$(expr $totalAmount+$amount)
done

现在我的脚本看起来像这样

for file in *.TXT
do
    amount=$(less $file | grep BPR | awk -F'CACH' '{c=$1;sub(/[^0-9]*/,"",c);total+=c/100}END{printf "%.2f", total}')
    echo "$totalAmount += $amount" | bc -l
done

echo $totalAmount

但是当我运行它时,它会在 $ totalAmout + = $ amount 时抛出错误。

我需要将总金额存储在变量中,例如totalAmount。

请帮帮我

6 个答案:

答案 0 :(得分:1)

在bash(> 3.0?)中你可以做到

(( totalAmount += amount ))

如果不是拼写错误的问题,您可以尝试将totalAmount=$(expr $totalAmout+$amount)行换成(( totalAmount += amount ))

如果您正在处理浮点数

totalAmount=`echo "$totalAmount + $amount" | bc -l`

答案 1 :(得分:0)

使用dcbc命令行计算器可以执行比整数加法更复杂的算术运算。

dc是反向修饰符号,而bc更为熟悉。

答案 2 :(得分:0)

我相信for循环和less是多余的。

如果您只需要totalAmount而不在任何地方使用amount,则可以摆脱循环和浮点求和。

totalAmount = $(grep BPR *.TXT | awk <awk_script>)

如果您让grep使用awk执行其工作,则/BPR/也是多余的。

totalAmount=$(awk -F'CACH' '/BPR/ {c=$1;sub(/[^0-9]*/,"",c);total+=c/100}END{printf "%.2f", total}' *.TXT)

答案 3 :(得分:0)

空间很重要,因为expr是一个处理其参数的命令。

expr $totalAmount+$amount

使用单个参数运行expr(假设参数扩展没有分词结果),而

expr $totalAmount + $amount

使用3个参数运行expr(同样,假设没有其他分词)。单个参数变量将简单地计算为相同的字符串;它不会尝试将参数解析为添加。

使用expr进行算术大多已经过时,因为POSIX标准包含

形式的算术扩展
totalAmount=$(( totalAmount + amount ))

答案 4 :(得分:0)

删除非必要部分后,您的脚本等同于:

totalAmount=$(awk -F'CACH' '
  /BPR/ {c=$1;sub(/[^0-9]*/,"",c);total+=c/100}
  END {printf "%.2f", total}' *.TXT)

答案 5 :(得分:0)

这对我有用。 :)啊啊!!我在这个剧本后花了12个多小时.. :(

amount=0
ediAmount=0
totalRawAmount=0
totalEdiAmount=0

for file in *.TXT
do
    amount=$(less $file | grep BPR | awk -F'CACH' '{c=$1;sub(/[^0-9]*/,"",c);total+=c/100}END{printf "%.2f", total}')
    totalRawAmount=$(echo "$amount"+"$totalRawAmount" | bc)
done

echo $totalRawAmount