Como adicionar variáveis ​​aritméticas em um script

26

Quero acumular o tamanho da linha de vários arquivos contidos em uma pasta. Eu escrevi o seguinte script:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

O que estou obtendo no final do script é 123 + 234 + 432 + ... e não o resultado da operação aritmética de adição.

curioso
fonte

Respostas:

50

Sua sintaxe de avaliação aritmética está incorreta. Use qualquer um dos seguintes (o primeiro é extremamente portátil, mas lento, o segundo é POSIX e portátil, exceto para o shell Bourne e versões anteriores do shell Almquist, os três últimos exigem ksh, bashou zsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

Ou você pode simplesmente pular o forloop inteiro e fazer:

wc -l folder/*

Ou, se você deseja apenas o total:

cat folder/* | wc -l

Ou com zsh e sua mult_iosopção:

wc -l < folder/*
homem a trabalhar
fonte
Não há necessidade do $interior ((...)). a=$((a+num))já está bem.
Weijun Zhou
se uma variável não estiver definida ou tiver um valor nulo, isso funcionaria, se não houver outra maneira de lidar com isso.
Bharat
7

você também pode usar esse código

    a=`expr $a + $num`
    echo $a

e verifique se existe um espaço nos dois lados de + em "$ a + $ num"

user1678213
fonte
sempre dê espaço nos dois lados do operador ao usar o comando expr para o cálculo.
user1678213
2

Você pode declarar o tipo de variável primeiro:

    declare -i a=0
    declare -i num=0
Dr_Hope
fonte
1

A edição anterior foi para uma postagem diferente. Aqui, apenas uma pequena modificação no script original:

deixe a = 0
let num = 0
para i na pasta / *
Faz
        num = `cat $ i | wc -l`
        a = $ (eco $ a + $ num | bc)
feito
eco $ a
Leo
fonte
11
Votado, pois a resposta não parece abordar a questão.
precisa saber é o seguinte
Sorry guys, agora corrigido
Leo
1

A resposta precisa especificar em qual shell o código é válido. Por exemplo, no bourne Shell ( sh), apenas as seguintes instruções são válidas:

a=$((a+num))
a=$(($a+$num))

enquanto as outras possibilidades listadas por @manatwork podem ser válidas em bourne again shell ( bash)

Jesus amado
fonte
-1

eu faço assim

MY_VARIABLE=$((num1+num2))
Hatem Badawi
fonte
3
Isso não acrescenta nada ao que já foi dito.
Kusalananda
11
é a resposta breve
Hatem Badawi