web-dev-qa-db-fra.com

Comment ajouter des variables arithmétiques dans un script

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.

29
curious

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 Bourne Shell et les versions antérieures du Almquist Shell, les trois dernières nécessitent ksh, bash ou zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Ou vous pouvez simplement ignorer toute la boucle for et faire simplement:

wc -l folder/*

Ou, si vous ne voulez que le total:

cat folder/* | wc -l

Ou avec zsh et son mult_ios option:

wc -l < folder/*
54
manatwork

vous pouvez également utiliser ce code

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

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

7
user1678213

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

    declare -i a=0
    declare -i num=0
2
Dr_Hope

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 dans bourne à nouveau Shell (bash)

1
loved.by.Jesus

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 /*
 do 
 num = `cat $ i | wc -l` 
 a = $ (echo $ a + $ num | bc) 
 fait 
 echo $ a 
1
Leo