expr - bash-c command




我如何在bash脚本中添加数字 (7)

我有这个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))       # also works
    num=$((num1 + 2 + 3))        # ...
    num=$[num1+num2]             # old, deprecated arithmetic expression syntax
    
  • 使用外部expr实用程序。 请注意,这只适用于真正旧的系统。

    num=`expr $num1 + $num2`     # whitespace for expr is important
    

对于浮点

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

  • bcexpr期望每个数字和运算符都是一个单独的参数,所以空格非常重要。 他们无法处理像3+ +4这样的参数。

    num=`expr $num1+ $num2`



在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;

有一千种方法可以做到这一点。 这里有一个使用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 FAQ 022所述 ,bash本身不支持浮点数。 如果需要对浮点数进行求和,则需要使用外部工具(如bcdc )。

在这种情况下,解决方案将是

num=$(dc <<<"$num $metab + p")

将可能浮点数累加到num


#!/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)
        let num=num+metab (line 16)
    done
    echo "$num"
done




mathematical-expressions