Operatori di confronto ed espressione di Bash


11

Sono nuovo alla programmazione bash. Ho letto due buone, lunghe guide, ma mi hanno incasinato gli operatori e le parole chiave.

Quali sono più comunemente e ampiamente utilizzati? Non so quando usare quale e perché.

  1. test, [[ ]]Oppure [ ]o anche(( ))
  2. $((exp)) o $[exp]
  3. -gto >, geo >=ecc.
  4. quando usare <e >o ( )e quando dobbiamo scappare con \: \< \(ecc.
  5. ==o =(confronti di stringhe)

Conosco le differenze fondamentali tra [e [[ma altre domande sono un mistero per me.

Grazie in anticipo


2
Un wiki molto utile che è aggiornato e menziona molte buone pratiche è il wiki di Greg . La guida Bash e le domande frequenti sono particolarmente utili.

Risposte:


5
  • testè una shell integrata che (ovviamente) verifica una determinata condizione. Alcune shell meno recenti richiedono un comando speciale. Quindi troverai anche un programma su /usr/bin/test.
  • [è anche un programma per verificare alcune condizioni. Questo software ha bisogno anche di una parentesi di chiusura e puoi trovarlo su /usr/bin/[.
  • [[…]]è un'alternativa a teste [. È stato sviluppato per la shell Korn ( ksh). Ma lo trovi anche nelle versioni Bash maggiori di 2 e nella Z Shell. Le parentesi doppie hanno alcune caratteristiche eleganti:
    • La shell non divide la parola o espande il nome del file.
    • Non hai bisogno di preventivi.
    • Invece di -a(AND) o -o(OR) puoi usare &&o ||.
    • Il =grado di fare molto di più.
  • ((…))è equivalente a let. Quindi sostanzialmente ((expression))è lo stesso di let "expression". Tuttavia, con lette puoi usare più di un'espressione, ma le doppie parentesi consentono solo un'espressione.
  • $((…))(e anche $[…]) esegue alcuni calcoli. La shell tenta di calcolare l'espressione all'interno delle parentesi graffe e sostituisce l'espressione con il risultato. Quindi echo $((1+1))porta a echo 2. Quindi le tue conchiglie stampano il numero 2.

Ogni volta che vuoi confrontare due numeri, dovresti usare l'opzione con un trattino e due lettere ( -ge, -ltecc.). Se vuoi confrontare le stringhe dovresti usare =o !=.

È difficile rispondere alla tua domanda sull'evasione. Perché dipende dal software che usi oltre alla shell. Quindi vale a dire grepe hanno grep -Ebisogno di una fuga diversa. Questo è anche il caso di sed, awke altri. Quindi l'opzione migliore è dare un'occhiata alla manpage. Dopo qualche tempo ti abitui e sai quando usare la fuga.


grazie. un'altra domanda - perché è possibile fare un confronto usando ((...)) - è più comune usare questa versione: if ((2> 1)) O questo: if [[2 -gt 1]]
MikeD

Suppongo che if [ 2 -gt 1 ]; …sia più comune, perché lo vedo più spesso negli script di shell e per quanto ne so questo è conforme a POSIX.
qbi

Un'altra cosa da tenere a mente è che [espressione] è vera se espressione restituisce / restituisce zero, ma ((espressione)) è vera se espressione restituisce / restituisce un valore diverso da zero.
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.