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.

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

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.


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

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

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.