2010-08-07 13 views
7

In varie guide e script, mi imbatto in persone che tendono a utilizzare una diversa sintassi delle istruzioni if. Qual è la differenza e quali sono le migliori pratiche? Credo che tutte le seguenti affermazioni e molte altre varianti restituiranno true:bash/sh if sintassi dell'istruzione

bar="foo" 
if [ "foo" = "foo" ] 
if [[ "foo" == $bar ]] 
if [ "foo" = "$bar" ] 
if [[ "foo" = "$bar" ]] 
if [[ "foo" -eq $bar ]] 
+1

possibile duplicato di [bash: parentesi doppia o singola, parentesi, parentesi graffe] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parenthes-curly-braces) –

+0

Leggi http://mywiki.wooledge.org/BashGuide http://mywiki.wooledge.org/BashFAQ http://mywiki.wooledge.org/BashPitfalls – Philipp

risposta

5

quanto ho capito

= aspetta stringhe

eq aspetta interi

"$ bar" è per le partite letterali, cioè z * può espandersi, ma "z *" letteralmente corrispondere al carattere jolly.

La differenza tra [] e [[]] è che in quest'ultima parola la suddivisione e l'espansione del nome del percorso non vengono eseguite, ma si trovano nel primo.

Inoltre [[]] consente agli operatori aggiuntivi:

& & (E), || (OR), > (String1 lessicalmente maggiore di String2), < (String1 lessicale inferiore Stringa2)

L'operatore di confronto == si comporta diversamente entro un test doppio staffe che tra parentesi singoli.

[[$ a == z *]] # Vero se $ a inizia con una "z" (corrispondenza del modello).

[[$ a == "z *"]] # Vero se $ a è uguale a z * (corrispondenza letterale).

[$ a == z *] # Il file globbing e la suddivisione in parole hanno luogo.

["$ a" == "z *"] # Vero se $ a è uguale a z * (corrispondenza letterale).

Partenza http://tldp.org/LDP/abs/html/comparison-ops.html per ulteriori informazioni

+0

Correzione/chiarimento minori: '=' e '==' fai esattamente il stessa cosa (cioè entrambi eseguono il pattern matching in '[[]]') tranne che alcune implementazioni di '[' non supportano '=='. Fondamentalmente, l'unica ragione per usare '==' è che è familiare alle altre lingue. Inoltre, '[' supporta i confronti di stringhe con '<' and '>', devi solo sfuggirli o verranno analizzati come reindirizzamenti I/O: '[stringa1 \

2

Si consiglia caso/esac.

case "$foo" in 
    "bar") echo "bar";; 
    *) echo "not equal";; 
esac 

No fretting sulla sintassi diversa.

3

[ è un builtin bash, [[ è una parola chiave bash. È consigliabile utilizzare sempre [[ se lo script non deve essere compatibile con altre shell (ad es. Se inizia con #!/bin/bash) e utilizzare [ solo per la compatibilità con la shell Bourne. Vedi http://mywiki.wooledge.org/BashFAQ/031.