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.arg1enum1qui 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è010e$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$arg1e$num1vengono espansi prima che lintera espressione aritmetica venga valutata. Se$arg1era(2e$num1era2), il comando precedente non sarebbe riuscito perché(2e2)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$arg1e$num1come 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 aexproperatori) oawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"sono i comandi standard per eseguire il confronto di stringhe utilizzandostrcoll().