Eu tenho esse script Bash e 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
Respostas:
Para números inteiros :
Use expansão aritmética :
$((EXPR))
Usando o
expr
utilitário externo . Observe que isso é necessário apenas para sistemas realmente antigos.Para ponto flutuante :
O Bash não suporta isso diretamente, mas existem algumas ferramentas externas que você pode usar:
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ços em branco em nenhum dos lados
=
, caso contrário, forçará o shell a interpretar a primeira palavra como o nome do aplicativo a ser executado (por exemplo,num=
ounum
)num= 1
num =2
bc
eexpr
espere cada número e operador como um argumento separado, para que os espaços em branco sejam importantes. Eles não podem processar argumentos como3+
+4
.num=`expr $num1+ $num2`
fonte
num1
enum2
existiam e tinham valores inteiros?$((..))
avaliação aritmética é executada no bash.expr
é executado como um processo separado, então será muito mais lento. usar este último em sistemas onde a avaliação arithemtic não é suportado (! sh = bash)$((…))
é padronizado pelo POSIX, deve se tornar cada vez mais raro oexpr
necessário.Use a
$(( ))
expansão aritmética.Consulte o Capítulo 13. Expansão aritmética para obter mais informações.
fonte
191.003 + 190
.Existem mil e uma maneiras de fazer isso. Aqui está um uso
dc
(uma calculadora de mesa com polimento reverso que suporta aritmética de precisão ilimitada):Mas se isso é muito tímido para você (ou a portabilidade é importante), você poderia dizer
Mas talvez você seja uma daquelas pessoas que acha que a RPN é nojenta e estranha; Não se preocupe!
bc
está aqui para você:Dito isto, existem algumas melhorias não relacionadas que você pode estar fazendo no seu script:
Conforme descrito na Bash FAQ 022 , o Bash não suporta nativamente números de ponto flutuante. Se você precisar somar números de ponto flutuante, será necessário o uso de uma ferramenta externa (como
bc
oudc
).Nesse caso, a solução seria
Para adicionar números acumulados de ponto flutuante em
num
.fonte
Na festança,
Observe que o bash pode lidar apenas com aritmética inteira, portanto, se o seu comando awk retornar uma fração, você precisará redesenhar: aqui está o código reescrito um pouco para fazer todas as contas no awk.
fonte
Eu sempre esqueço a sintaxe, então venho ao google, mas nunca encontro a que estou familiarizada: P. Isso é o mais limpo para mim e mais fiel ao que eu esperaria em outros idiomas.
fonte
fonte
Eu realmente gosto desse método também, menos confusão:
fonte
Você deve declarar metab como inteiro e, em seguida, usar avaliação aritmética
Para obter mais informações, consulte https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
fonte
Outra
POSIX
maneira portátil de cumprirbash
, que pode ser definida como uma função.bashrc
para todos os operadores aritméticos de conveniência.e chame-o na linha de comando como,
A idéia é usar o IFS (Input-Field-Separator) , uma variável especial
bash
usada para dividir palavras após a expansão e dividir 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
IFS
é alterado localmente e NÃO entra em vigor noIFS
comportamento padrão fora do escopo da função. Um trecho daman bash
página,O
"$(( $* ))"
representa a lista de argumentos passados para serem divididos+
e, posteriormente, o valor da soma é gerado usando aprintf
função A função pode ser estendida para adicionar escopo para outras operações aritméticas também.fonte
fonte
usar um shell embutido
let
, é semelhante a(( expr ))
fonte: https://www.computerhope.com/unix/bash/let.htm
fonte