Ein paar arithmetische Befehle, Dash, POSIX-Shell, sh, Increment

17

Was ist der Unterschied zwischen diesen beiden Beispielen in der POSIX-Shell, wenn eine Variable vor / nach dem Inkrementieren erstellt wird? Sie scheinen die gleichen Konsequenzen zu haben, würden aber unterschiedlich eingesetzt? Wann würden Sie eins dem anderen vorziehen?

X=$((X+1))

: $((X=X+1))
JM Becker
quelle

Antworten:

18

In Ihrem ersten Beispiel wird $((X+1))der Ausdruck X + 1 ausgewertet und zum Ergebnis erweitert, das dann der Variablen zugewiesen wird.

Im zweiten Beispiel werden $((X=X+1))Inkremente Xum eins ( $((X++))ebenfalls gültig und kürzer, aber nicht unbedingt von der Shell unterstützt) auf den neuen Wert von erweitert $X, der das erste Argument für den Befehl null ist :. Der Befehl null ignoriert seine Argumente und das Ergebnis wird verworfen (mit Nebenwirkungen).

Ich persönlich würde die erste Form aus drei (relativ subjektiven) Gründen vorziehen:

  • Der Null-Befehl ist unklar und wird missverstanden, was darauf hindeutet, dass er hier häufig Gegenstand verwirrter Fragen ist.
  • Die erste Form erscheint in Bezug auf die allgemeine Shell-Grammatik natürlicher und ähnelt sogar ein wenig dem alten Bewertungsstil.
  • Die erste Form ist klarer und prägnanter und beinhaltet keinen Befehl.

Sie müssten die erste Version verwenden, wenn Sie die Umgebung von nur einem Befehl wie ändern würden

X=$((X+1)) /usr/local/bin/something

Sie müssten das zweite Formular verwenden, um Argumenten direkt eine Bewertung hinzuzufügen:

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 klar.

Alexios
quelle