Questa domanda ha già una risposta qui :
Commenti
- stackoverflow.com/ a / 18668580/1032785
Answer
Questi operatori sono utilizzati, ad esempio, (( ... ))
e $(( ... ))
(rispettivamente valutazione aritmetica e espansione aritmetica ):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
E anche con let
. Quanto segue è equivalente al precedente:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Vedi la sezione denominata “VALUTAZIONE ARITMETICA” nel manuale di Bash.
Risposta
In bash
nello specifico:
-
((arg1 >= num1))
(ereditato daksh
) esegue confronti aritmetici.arg1
enum1
qui si riferiscono alle variabili di shell con lo stesso nome. Ogni variabile viene interpretata come unespansione aritmetica e il risultato viene sostituito. Qui se$arg1
è010
e$num1
è4+5
, il risultato sarà falso (il comando((...))
restituirà uno stato di uscita diverso da zero), perché010
è ottale per 8 e4+5
è 9. -
(($arg1 >= $num1))
: come sopra tranne che$arg1
e$num1
vengono espansi prima che lintera espressione aritmetica venga valutata. Se$arg1
era(2
e$num1
era2)
, il comando precedente non sarebbe riuscito perché(2
e2)
non sono espressioni valide di per sé. Ma qui avrebbe successo perché(2 >= 2)
sarebbe lespressione aritmetica valutata. In genere, allinterno delle espressioni aritmetiche, è meglio lasciare$
fuori. Confronta ad esempioa=2+2; echo "$((3 * $a))"
cona=2+2; echo "$((3 * a))"
. -
let "..."
(anche da ksh). Come((...))
tranne che “s analizzato come un normale comando, è meno leggibile, è poco portabile ed è necessario prestare maggiore attenzione alle citazioni. -
[ "$arg1" -ge "$num1" ]
. Questo è standard e portabile. Sono supportate solo le costanti decimali.[ 010 -ge 9 ]
è uguale a[ 10 -ge 9 ]
. -
[[ $arg1 -ge $num1 ]]
. Anche da ksh ma con grandi differenze. Questa volta vengono considerati$arg1
e$num1
come espressioni aritmetiche e non solo costanti decimali.[[ 010 -ge 9 ]]
restituisce nuovamente false. -
[[ $arg1 < $num1 ]]
. Confronto di stringhe. Questo utilizzastrcoll()
per confrontare le stringhe, quindi utilizzando lalgoritmo di ordinamento nella lingua. Tieni presente che mentre<
e>
utilizza lalgoritmo di ordinamento,=
/==
fa il confronto byte-byte, quindi potrebbero esserci coppie di stringhe per le quali tutti<
,>
e=
/==
restituisce false.<=
e>=
non sono supportati. -
[ "$arg1" "<" "$num1" ]
. Non standard. Come sopra, ma utilizzando il comando[
.<
deve essere citato in modo che “non sia considerato un operatore di reindirizzamento. -
expr " $arg1" "<=" " $num1" > /dev/null
(nota spazi per forzare il confronto lessicale ed evitare problemi con stringhe simili aexpr
operatori) oawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
sono i comandi standard per eseguire il confronto di stringhe utilizzandostrcoll()
.