Storicamente, il testcomando è 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 testcomando 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 testcomando, 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 exprcomando , 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 exprobsoleti, 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 01ma1 != 01e8 -lt 42ma8 > 42