Come utilizzare gli operatori di confronto in bash? [duplicate]

Questa domanda ha già una risposta qui :

Commenti

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 da ksh) esegue confronti aritmetici. arg1 e num1 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 e 4+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 era 2), il comando precedente non sarebbe riuscito perché (2 e 2) 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 esempio a=2+2; echo "$((3 * $a))" con a=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 utilizza strcoll() 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 a expr operatori) o awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" sono i comandi standard per eseguire il confronto di stringhe utilizzando strcoll().

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *