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.

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

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"


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

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

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)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.