Un paio di comandi aritmetici correlati, Dash, POSIX shell, sh, Increment


17

Quando si pre / post incrementa una variabile, in POSIX Shell, qual è la differenza tra questi due esempi. Sembrano che avrebbero le stesse conseguenze, ma sarebbero usati diversamente? Quando preferiresti l'uno all'altro?

X=$((X+1))

: $((X=X+1))

Risposte:


18

Nel tuo primo esempio, $((X+1))valuta l'espressione X + 1 e si espande al risultato, che viene quindi assegnato alla variabile.

Nel secondo esempio, $((X=X+1))incrementi Xdi uno ( $((X++))vale anche e più breve, ma non necessariamente supportata dalla shell), poi si espande al nuovo valore di $X, che è il primo argomento al comando nullo, :. Il comando null ignora i suoi argomenti e il risultato viene scartato (con effetti collaterali).

Preferirei personalmente la prima forma per tre motivi (relativamente soggettivi):

  • Il comando nullo è oscuro e incompreso, come indicato dal fatto che spesso è oggetto di domande confuse qui.
  • La prima forma sembra più naturale in termini di grammatica generale della shell e assomiglia un po 'al vecchio stile di valutazione.
  • Il primo modulo è più chiaro e più conciso e non comporta un comando.

Dovresti usare la prima versione se modificassi l'ambiente di un solo comando come

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

Dovresti utilizzare il secondo modulo per aggiungere direttamente la valutazione agli argomenti:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

Questo ha gli effetti collaterali desiderati, salva una riga ed è abbastanza chiaro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.