Tenho este guião e tive um problema na linha 16. Como eu posso pegar o resultado anterior da linha 15 e adicionar para a variável da 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
Para os inteiros:
Utilize expansão aritmética: $((EXPR))
num=$((num1 + num2)))
num=$(($num1 + $num2)) # também funciona
num=$((num1 + 2 + 3))) # ...
num=$[num1+num2] # sintaxe de expressão aritmética antiga e depreciada
Utilizando a utilidade externa expr
. Note que isto só é necessário para sistemas realmente antigos.
num=`expr $num1 + $num2` # espaço em branco para expr é importante
Para ponto flutuante:
O Bash não'não suporta diretamente isto, mas há's um par de 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 utilizar 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 =
, caso contrário, forçará a shell a interpretar a primeira palavra como o nome da aplicação a ser executada (por exemplo: num=
ou num
)
num= 1
num =2
bc' e 'expr' esperam cada número e operador como um argumento separado, por isso o espaço em branco é importante. Eles não podem processar argumentos como 3+
+4
.
num=`expr $num1+ $num2
``
Utilize o $(( ))
expansão aritmética.
num=$(( $num + $metab ))
Consulte http://tldp.org/LDP/abs/html/arithexp.html para mais informações.
Há mil e uma maneiras de o fazer. Aqui's um utilizando dc
:
dc <<<"$num1 $num2 + p"
Mas se isso's é demasiado bash-y para si (ou portabilidade importa) você poderia dizer
echo $num1 $num2 + p | dc
Mas talvez você'é uma daquelas pessoas que acha a RPN nojenta e estranha; não'não se preocupe! O "bc" está aqui para ti:
bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc
Dito isto, há algumas melhorias não relacionadas que poderia estar a fazer no seu guião.
#!/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
EDITAR:
Como descrito em BASH FAQ 022, o bash não suporta nativamente números de ponto flutuante. Se você precisa somar números de ponto flutuante, o uso de uma ferramenta externa (como bc
ou dc
) é necessário.
Neste caso, a solução seria
num=$(dc <<<"$num $metab + p")
Para adicionar números de pontos de flutuação possíveis em `num'.