<Precedenti | Contenuti | Succ.>
Assegnazione
Sebbene il suo utilizzo possa non essere immediatamente evidente, le espressioni aritmetiche possono eseguire assegnazioni. Abbiamo eseguito assegnazioni molte volte, sebbene in contesti diversi. Ogni volta che assegniamo un valore a una variabile, eseguiamo un'assegnazione. Possiamo farlo anche all'interno di espressioni aritmetiche:
[io@linuxbox~]$ pippo=
[io@linuxbox~]$ echo $foo
[io@linuxbox~]$ if (( foo = 5 )); then echo "È vero."; fi
È vero.
[io@linuxbox~]$ echo $foo
5
[io@linuxbox~]$ pippo=
[io@linuxbox~]$ echo $foo
[io@linuxbox~]$ if (( foo = 5 )); then echo "È vero."; fi
È vero.
[io@linuxbox~]$ echo $foo
5
Nell'esempio sopra, assegniamo prima un valore vuoto alla variabile foo e verifichiamo che sia effettivamente vuoto. Successivamente, eseguiamo un if con il comando composto (( pippo = 5
)). Questo processo fa due cose interessanti: 1) assegna il valore 5 alla variabile
foo e 2) viene valutato come true perché a foo è stato assegnato un valore diverso da zero.
Nota: È importante ricordare il significato esatto del = nell'espressione sopra. Un singolo = esegue l'incarico. pippo = 5 dice "fare foo uguale a 5", mentre == valuta l'equivalenza. pippo == 5 dice "fa foo uguale a 5?" Questa è una caratteristica comune in molti linguaggi di programmazione. Nella shell, questo può essere un po' confuso perché test il comando accetta un singolo = per l'equivalenza delle stringhe. Un altro motivo per usare il più moderno [[]] e (( )) comandi composti al posto di test.
Oltre a un =, la shell fornisce anche notazioni che eseguono alcune assegnazioni molto utili:
Tabella 34-4: Operatori di assegnazione
Notazione Descrizione
Notazione Descrizione
parametro = APPREZZIAMO Compito semplice. Assegnazioni APPREZZIAMO a parametro.
parametro += APPREZZIAMO Addizione. Equivalente a parametro = parametro +
valore.
parametro -= APPREZZIAMO Sottrazione. Equivalente a parametro = parametro -
valore.
parametro *= APPREZZIAMO Moltiplicazione. Equivalente a parametro = parametro
* valore.
parametro /= APPREZZIAMO Divisione intera. Equivalente a parametro =
parametro/valore.
parametro %= APPREZZIAMO Modulo. Equivalente a parametro = parametro %
valore.
parametro++ Variabile post-incremento. Equivalente a parametro =
parametro + 1 (tuttavia, vedere la discussione di seguito).
parametro−− Post-decremento variabile. Equivalente a parametro =
parametro − 1.
++parametro Pre-incremento variabile. Equivalente a parametro =
parametro + 1.
--parametro Pre-decremento variabile. Equivalente a parametro =
parametro − 1.
Questi operatori di assegnazione forniscono una comoda scorciatoia per molte comuni operazioni aritmetiche. Di particolare interesse sono gli operatori di incremento (++) e decremento (−−), che aumentano o diminuiscono il valore dei loro parametri di uno. Questo stile di notazione è tratto dal linguaggio di programmazione C ed è stato incorporato in numerosi altri linguaggi di programmazione, tra cui bash.
Gli operatori possono apparire all'inizio o alla fine di un parametro. Sebbene entrambi incrementino o decrementino il parametro di uno, i due posizionamenti presentano una sottile differenza. Se posizionati all'inizio del parametro, il parametro viene incrementato (o decrementato) prima che venga restituito. Se posizionati dopo, l'operazione viene eseguita. dopo Il parametro viene restituito. È piuttosto strano, ma è il comportamento previsto. Ecco una dimostrazione:
[io@linuxbox~]$ pippo=1 [io@linuxbox~]$ echo $((foo++)) 1
[io@linuxbox~]$ echo $foo
[io@linuxbox~]$ pippo=1 [io@linuxbox~]$ echo $((foo++)) 1
[io@linuxbox~]$ echo $foo
2
2
Se assegniamo il valore uno alla variabile foo e poi incrementarlo con il ++ operatore posizionato dopo il nome del parametro, foo viene restituito con il valore uno. Tuttavia, se guardiamo il valore della variabile una seconda volta, vediamo il valore incrementato. Se inseriamo ++ operatore davanti al parametro, otteniamo il comportamento più atteso:
[io@linuxbox~]$ pippo=1 [io@linuxbox~]$ echo $((++foo)) 2
[io@linuxbox~]$ echo $foo
2
[io@linuxbox~]$ pippo=1 [io@linuxbox~]$ echo $((++foo)) 2
[io@linuxbox~]$ echo $foo
2
Per la maggior parte delle applicazioni shell, l'aggiunta del prefisso all'operatore sarà la soluzione più utile.
Gli operatori ++ e -- vengono spesso utilizzati insieme ai cicli. Apporteremo alcuni miglioramenti al nostro script modulo per renderlo un po' più fluido:
#! / Bin / bash
# modulo2: dimostra l'operatore modulo per ((i = 0; i <= 20; ++io )); fare
Se (((5% XNUMX) == 0 )); quindi printf "<%d> " $i
altro
printf "%d " $i
fi fatto
printf "\ n"
#! / Bin / bash
# modulo2: dimostra l'operatore modulo per ((i = 0; i <= 20; ++io )); fare
Se (((5% XNUMX) == 0 )); quindi printf "<%d> " $i
altro
printf "%d " $i
fi fatto
printf "\ n"