我有这个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
10 回答
有一千零一种方法可以做到这一点 . 这是使用
dc
的一个:但是,如果这对你来说太过苛刻(或者可移植性问题)你可以说
但也许你不用担心!
bc
在这里为您服务:也就是说,您可以对脚本进行一些无关的改进
编辑:
如BASH FAQ 022中所述,bash本身不支持浮点数 . 如果需要对浮点数求和,则需要使用外部工具(如
bc
或dc
) .在这种情况下,解决方案将是
将累积的可能浮点数添加到
num
中 .我也非常喜欢这种方法,不那么杂乱:
在bash,
请注意,bash只能处理整数运算,所以如果你的awk命令返回一个分数,那么你需要重新设计:这里你的代码重写了一下,用awk做了所有的数学运算 .
对于整数:
$((EXPR))
expr
实用程序 . 请注意,这仅适用于真正的旧系统 .对于浮点数:
Bash不直接支持这个,但是你可以使用几个外部工具:
您也可以使用科学记数法(例如:
2.5e+2
)常见的陷阱:
=
两侧不能有空格,否则会强制shell将第一个单词解释为要运行的应用程序的名称(例如:num=
或num
)num = 1 num = 2
bc
和expr
期望每个数字和运算符作为单独的参数,因此空格很重要 . 他们无法处理像3+
+4
这样的参数 .num =
expr $ num1 $ num2
使用
$(( ))
算术扩展 .有关更多信息,请参见http://tldp.org/LDP/abs/html/arithexp.html .
您应该将metab声明为整数,然后使用算术评估
有关更多信息,请参阅https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
另一种在
bash
中可以兼容的POSIX
方式,可以在.bashrc
中为所有算术运算符定义为方便的函数 .并在命令行中调用它,因为,
这个想法是使用Input-Field-Separator(IFS),这是
bash
中的一个特殊变量,用于扩展后的单词拆分,并将行拆分为单词 . 该函数在本地更改值以使用分词字符作为和运算符+
.请记住
IFS
在本地更改,并且不会对函数作用域外的默认IFS
行为生效 . 摘自man bash
页面,"$(( $* ))"
表示传递给+
分割的参数列表,稍后使用printf
函数输出总和值 . 该函数可以扩展为其他算术运算的范围 .我总是忘记语法,所以我来谷歌,但后来我找不到我熟悉的那个:P . 这对我来说是最干净的,更符合我对其他语言的期望 .