bash - number - sum linux shell script




Como posso adicionar números em um script bash (7)

Eu tenho este script bash e eu tive um problema na linha 16. Como posso pegar o resultado anterior da linha 15 e adicioná-lo à variável na linha 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

Eu realmente gosto desse método também, menos confusão:

count=$[count+1]

Eu sempre esqueço a sintaxe, então eu venho ao google, mas eu nunca encontro o que eu estou familiarizado: p. Este é o mais limpo para mim e mais fiel ao que eu esperaria em outros idiomas.

i=0
((i++))

echo $i;

No bash,

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

Note que o bash só pode tratar aritmética de inteiros, então se o seu comando awk retorna uma fração, então você vai querer reprojetar: aqui está seu código reescrito um pouco para fazer todas as contas no 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

Outra maneira compatível com POSIX portátil de fazer no bash , que pode ser definida como uma função em .bashrc para todos os operadores aritméticos de conveniência.

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

e basta chamá-lo na linha de comando como,

addNumbers 1 2 3 4 5 100
115

A idéia é usar o Input-Field-Separator(IFS) , uma variável especial no bash usada para dividir palavras após a expansão e dividir as linhas em palavras. A função altera o valor localmente para usar o caractere de divisão de palavras como o operador de soma + .

Lembre-se de que o IFS é alterado localmente e NÃO tem efeito sobre o comportamento padrão do IFS fora do escopo da função. Um trecho da página do man bash ,

O shell trata cada caractere do IFS como um delimitador e divide os resultados das outras expansões em palavras nesses caracteres. Se IFS não estiver definido, ou seu valor for exatamente o padrão, as seqüências de,, e no início e no final dos resultados das expansões anteriores serão ignoradas, e qualquer sequência de caracteres IFS que não esteja no início ou no final servirá para delimitar palavras.

O "$(( $* ))" representa a lista de argumentos passados ​​para serem divididos por + e mais tarde o valor da soma é gerado usando a função printf . A função pode ser estendida para adicionar escopo para outras operações aritméticas também.



Para números inteiros :

  • Use expansão aritmética : $((EXPR))

    num=$((num1 + num2))
    num=$(($num1 + $num2))       # also works
    num=$((num1 + 2 + 3))        # ...
    num=$[num1+num2]             # old, deprecated arithmetic expression syntax
  • Usando o utilitário expr externo. Observe que isso é necessário apenas para sistemas realmente antigos.

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

Para ponto flutuante :

O Bash não suporta diretamente isso, mas há algumas ferramentas externas que você pode usar:

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

Você também pode usar notação científica (por exemplo: 2.5e+2 )

Armadilhas comuns :

  • Ao definir uma variável, você não pode ter espaço em branco em nenhum dos lados de = , senão forçará o shell a interpretar a primeira palavra como o nome do aplicativo a ser executado (por exemplo: num= ou num )

    num= 1 num =2

  • bc e expr esperam cada número e operador como um argumento separado, então o espaço em branco é importante. Eles não podem processar argumentos como 3+ +4 .

    num=`expr $num1+ $num2`


 #!/bin/bash
read X
read Y
echo "$(($X+$Y))"




mathematical-expressions