GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zählererhöhung in Bash-Schleife funktioniert nicht

Erstens erhöhen Sie den Zähler nicht. Ändern von COUNTER=$((COUNTER)) in COUNTER=$((COUNTER + 1)) oder COUNTER=$[COUNTER + 1] wird es erhöhen.

Zweitens ist es schwieriger, Subshell-Variablen an den Aufgerufenen zurückzupropagieren, als Sie vermuten. Variablen in einer Subshell sind außerhalb der Subshell nicht verfügbar. Dies sind lokale Variablen des untergeordneten Prozesses.

Eine Möglichkeit, dies zu lösen, besteht darin, eine temporäre Datei zum Speichern des Zwischenwerts zu verwenden:

TEMPFILE=/tmp/$$.tmp
echo 0 > $TEMPFILE

# Loop goes here
  # Fetch the value and increase it
  COUNTER=$[$(cat $TEMPFILE) + 1]

  # Store the new value
  echo $COUNTER > $TEMPFILE

# Loop done, script done, delete the file
unlink $TEMPFILE

COUNTER=1
while [ Your != "done" ]
do
     echo " $COUNTER "
     COUNTER=$[$COUNTER +1]
done

GETESTETE BASH:Centos, SuSE, RH


COUNTER=$((COUNTER+1)) 

ist ein ziemlich ungeschicktes Konstrukt in der modernen Programmierung.

(( COUNTER++ ))

sieht "moderner" aus. Sie können auch

verwenden
let COUNTER++

wenn Sie denken, dass dies die Lesbarkeit verbessert. Manchmal bietet Bash zu viele Möglichkeiten, Dinge zu tun - Perl-Philosophie, nehme ich an -, wenn Python "es gibt nur einen richtigen Weg, es zu tun" vielleicht angemessener wäre. Das ist eine umstrittene Aussage, falls es jemals eine gegeben hat! Wie auch immer, ich würde vorschlagen, dass das Ziel (in diesem Fall) nicht nur darin besteht, eine Variable zu erhöhen, sondern (allgemeine Regel) auch Code zu schreiben, den jemand anderes verstehen und unterstützen kann. Konformität trägt wesentlich dazu bei.

HTH


Linux
  1. Build-Nummer in Bash erhöhen?

  2. Array in Bash nicht gefunden

  3. jp funktioniert nicht

  4. fflush() funktioniert nicht unter Linux

  5. Linux-limits.conf funktioniert nicht?

Bash-while-Schleife

Bash für Schleife

Bash bis Loop

So erhöhen und verringern Sie die Variable in Bash (Zähler)

Bash brechen und fortfahren

Echo-Neuzeilenzeichen funktioniert nicht in Bash