我有这个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
另一种在Bash中兼容POSIX的可移植方法,可以将其定义为.bashrc中所有算术运算符的函数。
addNumbers () {
local IFS='+'
printf "%s\n" "$(( $* ))"
}
在命令行中调用它,
addNumbers 1 2 3 4 5 100
115
这个想法是使用输入字段分隔符(IFS),这是Bash中的一个特殊变量,用于展开后的单词分割和将行分割为单词。该函数在局部更改值,以使用分词字符作为和运算符+。
请记住,IFS是在本地更改的,不会对函数作用域之外的默认IFS行为生效。这是男人狂欢页面的节选,
shell将IFS的每个字符视为分隔符,并将其他展开的结果划分为这些字符上的单词。如果未设置IFS,或者它的值为默认值,则忽略前面展开结果的开头和结尾的、、和序列,并且不在开头或结尾的任何IFS字符序列都用于分隔单词。
“$(($*))”表示传递的参数列表,将被+分割,然后使用printf函数输出求和值。该函数还可以扩展为其他算术运算添加作用域。
有一千零一种方法可以做这件事。下面是一个使用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中。