Comment ajouter des variables arithmétiques dans un script

26

Je souhaite accumuler la taille de ligne d'un certain nombre de fichiers contenus dans un dossier. J'ai écrit le script suivant:

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

Ce que j'obtiens à la fin du script est 123 + 234 + 432 + ... et non le résultat de l'opération arithmétique d'addition.

curieuse
la source

Réponses:

50

Votre syntaxe d'évaluation arithmétique est incorrecte. Utilisez l'une des méthodes suivantes (la première est extrêmement portable mais lente, la seconde est POSIX et portable, sauf pour le shell Bourne et les versions antérieures du shell Almquist, les trois dernières nécessitent ksh, bashou zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Ou vous pouvez simplement sauter la forboucle entière et faire simplement:

wc -l folder/*

Ou, si vous ne voulez que le total:

cat folder/* | wc -l

Ou avec zsh et son mult_iosoption:

wc -l < folder/*
homme au travail
la source
Pas besoin de l' $intérieur ((...)). a=$((a+num))est déjà bien.
Weijun Zhou
si une variable n'est pas définie ou n'a pas de valeur nulle, cela fonctionnerait-il, sinon aucune autre façon de gérer cela.
Bharat
7

vous pouvez également utiliser ce code

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

et ASSUREZ-VOUS QU'IL Y A UN ESPACE DES DEUX CÔTÉS DE + DANS "$ a + $ num"

user1678213
la source
donnez toujours de l'espace des deux côtés de l'opérateur lorsque vous utilisez la commande expr pour le calcul.
user1678213
2

Vous pouvez d'abord déclarer le type de variable:

    declare -i a=0
    declare -i num=0
Dr_Hope
la source
1

Désolé, l'édition précédente concernait un autre article. Ici, juste une petite modification du script original:

soit a = 0
soit num = 0
pour i dans le dossier / *
faire
        num = `cat $ i | wc -l`
        a = $ (écho $ a + $ num | bc)
terminé
écho $ a
Leo
la source
1
Voté, car la réponse ne semble pas répondre à la question.
Time4Tea
Désolé les gars, maintenant corrigé
Leo
1

La réponse doit spécifier dans quel shell le code est valide. Par exemple, dans le Bourne Shell ( sh), seules les instructions suivantes sont valides:

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

tandis que les autres possibilités listées par @manatwork peuvent être valables à nouveau dans bourne shell ( bash)

aimé.par.Jésus
la source
-1

je le fais comme ça

MY_VARIABLE=$((num1+num2))
Hatem Badawi
la source
3
Cela n'ajoute rien à ce qui a déjà été dit.
Kusalananda
1
c'est la réponse brève
Hatem Badawi