Storicamente, il test
comando è esistito per primo (almeno fino alla Unix Seventh Edition nel 1979). Ha usato gli operatori =
e !=
per confrontare le stringhe, e -eq
, -ne
, -lt
, ecc per confrontare i numeri. Ad esempio, test 0 = 00
è falso, ma test 0 -eq 00
è vero. Non so perché sia stata scelta questa sintassi, ma potrebbe essere stato per evitare di usare <
e >
, che la shell avrebbe analizzato come operatori di reindirizzamento. Il test
comando ha ottenuto un'altra sintassi qualche anno dopo: [ … ]
è equivalente a test …
.
La [[ … ]]
sintassi condizionale, all'interno della quale <
e >
può essere utilizzata come operatore senza virgolette, è stata aggiunta in seguito, in ksh. Ha mantenuto la retrocompatibilità con [ … ]
, quindi ha usato gli stessi operatori, ma ha aggiunto <
e >
confrontato le stringhe (ad esempio, [[ 9 > 10 ]]
ma [[ 9 -lt 10 ]]
). Per ulteriori informazioni, consultare l' utilizzo della parentesi singola o doppia - bash
Le espressioni aritmetiche arrivarono anche più tardi del test
comando, nella shell Korn , in qualche momento degli anni '80. Seguirono la sintassi del linguaggio C, che era molto popolare nei circoli Unix. Quindi hanno usato gli operatori di C: ==
per uguaglianza, <=
per meno o uguale, ecc.
Unix Seventh Edition non aveva espressioni aritmetiche, ma aveva il expr
comando , che implementava anche una sintassi simil-C per operazioni su numeri interi, inclusi i suoi operatori di confronto. In uno script di shell, i personaggi <
e >
dovevano essere citati per proteggerli dalla shell, ad esempio if expr 1 \< 2; …
è equivalente a if test 1 -lt 2; …
. L'aggiunta di espressioni aritmetiche alla shell ha reso la maggior parte degli usi expr
obsoleti, quindi non è noto oggi.
In uno script sh, generalmente useresti espressioni aritmetiche per calcolare un valore intero e [ … ]
per confrontare numeri interi.
if [ "$((x + y))" -lt "$z" ]; then …
In uno script ksh, bash o zsh, puoi usare ((…))
entrambi.
if ((x + y < z)); then …
Il [[ … ]]
modulo è utile se si desidera utilizzare condizionali che coinvolgono cose diverse dagli interi.
= != < <= > >=
confrontare le stringhe .1 -eq 01
ma1 != 01
e8 -lt 42
ma8 > 42