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.

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/*

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"


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

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

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)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.