So fügen Sie arithmetische Variablen in ein Skript ein

26

Ich möchte die Zeilengröße einer Anzahl 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 erhalte, ist 123 + 234 + 432 + ... und nicht das Ergebnis der arithmetischen Addition.

neugierig
quelle

Antworten:

50

Ihre arithmetische Auswertungssyntax ist falsch. Verwenden eines der folgenden (die erste sehr leicht zu transportieren ist , aber langsam ist , ist die zweite POSIX und tragbar , außer in dem Bourne - Shell und frühere Versionen des Almquist Schale, wobei die letzten drei erfordern ksh, bashoder zsh):

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

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

((a=a+num))

let a=a+num

((a+=num))

Oder Sie können einfach die gesamte forSchleife überspringen und Folgendes tun:

wc -l folder/*

Oder, wenn Sie nur die Summe wollen:

cat folder/* | wc -l

Oder mit zsh und seiner mult_iosOption:

wc -l < folder/*
Mann bei der Arbeit
quelle
Keine Notwendigkeit für das $Innere ((...)). a=$((a+num))ist schon in ordnung.
Weijun Zhou
Wenn eine Variable nicht gesetzt ist oder einen Nullwert hat, würde dies funktionieren, wenn es keine andere Möglichkeit gibt, damit umzugehen.
Bharat
7

Sie können diesen Code auch verwenden

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

und vergewissern Sie sich, dass sich BEIDSEITIG EIN PLATZ VON + IN "$ a + $ num" befindet.

user1678213
quelle
Lassen Sie immer auf beiden Seiten des Operators Platz, wenn Sie den Befehl expr für die Berechnung verwenden.
user1678213
2

Sie könnten zuerst den Variablentyp deklarieren:

    declare -i a=0
    declare -i num=0
Dr_Hope
quelle
1

Entschuldigung, die vorherige Bearbeitung war für einen anderen Beitrag. Hier nur eine kleine Modifikation des Originalskripts:

lass a = 0
sei num = 0
für ich in ordner / *
machen
        num = `cat $ i | wc -l`
        a = $ (echo $ a + $ num | bc)
getan
echo $ a
Löwe
quelle
1
Abgestimmt, da die Antwort die Frage nicht zu beantworten scheint.
Time4Tea
Sorry Jungs, jetzt korrigiert
Leo
1

In der Antwort muss angegeben werden, in welcher Shell 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 in bourne again shell ( bash) gültig sein können

geliebt.von.Jesus
quelle
-1

Ich mache es so

MY_VARIABLE=$((num1+num2))
Hatem Badawi
quelle
3
Dies fügt nichts zu dem hinzu, was bereits gesagt wurde.
Kusalananda
1
Es ist die kurze Antwort
Hatem Badawi