我有这个Bash脚本,在第16行有一个问题。
如何获取第15行之前的结果并添加
变成第16行中的变量?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
有一千零一种方法可以做这件事。下面是一个使用dc(一种反向波兰台式计算器,支持无限精度计算)的例子:
dc <<<"$num1 $num2 + p"
但如果这对你来说太糟糕了(或者便携性问题),你可以说
echo $num1 $num2 + p | dc
但也许你是那些认为RPN讨厌又奇怪的人之一;别担心!BC为您服务:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
也就是说,你可以对你的脚本进行一些无关的改进:
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in output-$i-* ; do # 'for' can glob directly, no need to ls
echo "$j"
# 'grep' can read files, no need to use 'cat'
metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
num=$(( $num + $metab ))
done
echo "$num"
done
正如Bash常见问题解答022中所述,Bash本身不支持浮点数。如果需要对浮点数求和,则需要使用外部工具(如bc或dc)。
在这种情况下,解决方案是
num=$(dc <<<"$num $metab + p")
将可能的浮点数累加到num中。
整数:
使用算术展开:$((EXPR))
Num =$(num1 + num2))
num=$(($num1 + $num2)) #同样有效
Num =$((num1 + 2 + 3)) #…
num=$[num1+num2] #过时的算术表达式语法
使用外部expr实用程序。注意,只有非常老的系统才需要这样做。
num= ' expr $num1 + $num2 ' # expr的空格很重要
对于浮点数:
Bash并不直接支持这一点,但是你可以使用一些外部工具:
num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc) # Whitespace for echo is important
您也可以使用科学符号(例如,2.5e+2)。
常见的陷阱:
在设置变量时,=的两边不能有空格,否则将迫使shell将第一个单词解释为要运行的应用程序的名称(例如,num=或num)
Num = 1 Num =2
BC和expr期望每个数字和运算符作为单独的参数,因此空格很重要。它们不能处理像3+ +4这样的参数。
= ' expr $num1+ $num2 '