如何在bash脚本中添加数字

我有这个bash脚本,我在第16行遇到一个问题。 我怎样才能把第15行的结果添加到第16行的变量中呢? 到第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
对该问题的评论 (1)

对于整数

  • 使用算术扩展: $((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)。

    < strike>`num= 1` < strike>`num =2`
  • bcexpr希望每个数字和运算符都是一个单独的参数,所以空格很重要。它们不能处理像3+``+4这样的参数。

    < strike>``num=`expr $num1+ $num2``
评论(10)

使用$(())的算术扩展。

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

更多信息见http://tldp.org/LDP/abs/html/arithexp.html。

评论(2)

有一千零一种方法可以做到这一点。这里有一个使用`dc'的方法。


dc 
评论(1)

在bash中。

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

请注意,bash只能处理整数运算,所以如果你的awk命令返回的是一个分数,那么你'会想要重新设计。 这里是你的代码,重写一下,在awk中做所有的数学运算。


num=0
for ((i=1; i
评论(0)

我总是忘了语法,所以我就来google,但后来我一直没有找到我熟悉的那个:P。 这对我来说是最简洁的,也更符合我对其他语言的期待。

i=0
((i++))

echo $i;
评论(1)

我也很喜欢这种方法,少了些杂乱。

count=$[count+1]
评论(3)
 #!/bin/bash
read X
read Y
echo "$(($X+$Y))"
评论(1)

你应该将metab声明为整数,然后使用算术评估。

declare -i metab num
...
num+=metab
...

更多信息请见https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic

评论(0)

另一种可移植的POSIX兼容方式,可以在.bashrc中定义为一个函数,方便所有的算术运算符。

addNumbers () {
    local IFS='+'
    printf "%s\n" "$(( $* ))"
}

并在命令行中调用它为。

addNumbers 1 2 3 4 5 100
115

其思路是使用输入-字段-分隔符(IFS),这是bash中的一个特殊变量,用于扩展后的拆字,并将行拆成字。 该函数在本地改变值,使用拆字符作为和运算符+

请记住,IFS是在本地改变的,不会对函数范围外的默认IFS行为产生影响。 摘录自man bash页面。

shell将IFS的每一个字符作为定界符,并将其他扩展的结果分割成这些字符上的字。 如果IFS没有设置,或者它的值正好是<空格><制表符><换行>,即默认值,那么<空格>、<制表符>和<换行&gt.的序列将被忽略。 在前面扩展结果的开头和结尾处的序列会被忽略,任何不在开头或结尾处的IFS字符序列都会被用来分隔单词。

"$(( $* ))"表示传递过来的参数列表要被+分割,之后用printf函数输出和值。 该函数还可以进行扩展,以增加其他算术运算的范围。

评论(0)

#!/bin/bash

num=0
metab=0

for ((i=1; i
评论(0)