Was ist der Unterschied zwischen diesen beiden Beispielen beim Vor-/Nachinkrementieren einer Variable in der POSIX-Shell? Sie scheinen die gleichen Konsequenzen zu haben, aber würden sie unterschiedlich verwendet werden? Wann würden Sie das eine dem anderen vorziehen?
X=$((X+1))
: $((X=X+1))
Antwort1
In Ihrem ersten Beispiel $((X+1))
wird der Ausdruck X + 1 ausgewertet und zum Ergebnis erweitert, das dann der Variablen zugewiesen wird.
Im zweiten Beispiel wird um eins $((X=X+1))
erhöht ( ist auch gültig und kürzer, wird aber nicht unbedingt von der Shell unterstützt) und dann auf den neuen Wert von erweitert , der das erste Argument des Nullbefehls ist, . Der Nullbefehl ignoriert seine Argumente und das Ergebnis wird verworfen (mit Nebenwirkungen).X
$((X++))
$X
:
Ich persönlich würde die erste Form aus drei (relativ subjektiven) Gründen bevorzugen:
- Der Nullbefehl ist unklar und wird missverstanden, was sich daran zeigt, dass er hier häufig Gegenstand verwirrender Fragen ist.
- Die erste Form scheint im Hinblick auf die allgemeine Shell-Grammatik natürlicher und ähnelt sogar ein wenig dem alten Auswertungsstil.
- Die erste Form ist klarer und prägnanter und beinhaltet keinen Befehl.
Sie müssen die erste Version verwenden, wenn Sie die Umgebung eines einzigen Befehls ändern möchten, wie
X=$((X+1)) /usr/local/bin/something
Um den Argumenten direkt eine Auswertung hinzuzufügen, müssen Sie die zweite Form verwenden:
ls -la "file-$((X++))" # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Dies hat die gewünschten Nebenwirkungen, spart eine Zeile und ist ziemlich übersichtlich.