我有这个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

当前回答

整数:

使用算术展开:$((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 '

其他回答

另一种在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函数输出求和值。该函数还可以扩展为其他算术运算添加作用域。

我也很喜欢这个方法。有更少的杂乱:

count=$[count+1]

在Bash中,

 num=5
 x=6
 (( num += x ))
 echo $num   # ==> 11

请注意,Bash只能处理整数算术,因此如果您的AWK命令返回一个分数,那么您将需要重新设计:以下是在AWK中重写的代码,以完成所有数学运算。

num=0
for ((i=1; i<=2; i++)); do
    for j in output-$i-*; do
        echo "$j"
        num=$(
           awk -v n="$num" '
               /EndBuffer/ {sum += $2}
               END {print n + (sum/120)}
           ' "$j"
        )
    done
    echo "$num"
done

我总是忘记语法,所以我来到谷歌搜索,但我从来没有找到一个我熟悉的:P。这对我来说是最干净的,更符合我对其他语言的期望。

i=0
((i++))

echo $i;

使用$(())算术展开。

num=$(( $num + $metab ))

见第13章。算术展开以获得更多信息。