Einige arithmetikbezogene Befehle, Dash, POSIX-Shell, sh, Increment

Einige arithmetikbezogene Befehle, Dash, POSIX-Shell, sh, Increment

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.

verwandte Informationen