it-swarm.com.de

So fügen Sie einem Skript arithmetische Variablen hinzu

Ich möchte die Zeilengröße einer Reihe von Dateien in einem Ordner akkumulieren. Ich habe folgendes Skript geschrieben:

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

Was ich am Ende des Skripts bekomme, ist 123 + 234 + 432 + ... und nicht das Ergebnis der arithmetischen Addition.

29
curious

Ihre arithmetische Auswertungssyntax ist falsch. Verwenden Sie eine der folgenden Optionen (die erste ist extrem portabel, aber langsam, die zweite ist POSIX und portabel, mit Ausnahme der Bourne-Shell und früherer Versionen der Almquist-Shell. Die letzten drei erfordern ksh, bash oder zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Oder Sie können einfach die gesamte for -Schleife überspringen und einfach Folgendes tun:

wc -l folder/*

Oder wenn Sie nur die Summe wollen:

cat folder/* | wc -l

Oder mit zsh und seinem mult_ios Möglichkeit:

wc -l < folder/*
54
manatwork

sie können diesen Code auch verwenden

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

und STELLEN SIE SICHER, DASS ES IS EIN RAUM AUF BEIDEN SEITEN VON + IN "$ a + $ num"

7
user1678213

Sie können zuerst den Variablentyp deklarieren:

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

Die Antwort muss in welche Shell angeben, dass der Code gültig ist. Zum Beispiel sind in der bourne Shell (sh) nur die folgenden Anweisungen gültig:

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

während die anderen von @manatwork aufgelisteten Möglichkeiten möglicherweise wieder in bourne gültig sind Shell (bash)

1
loved.by.Jesus

Entschuldigung, die vorherige Bearbeitung war für einen anderen Beitrag. Hier nur eine kleine Änderung am ursprünglichen Skript:

 let a = 0 
 let num = 0 
 für i im Ordner /*
 do 
 num = `cat $ i | wc -l` 
 a = $ (echo $ a + $ num | bc) 
 erledigt 
 echo $ a 
1
Leo