2010-04-14 21 views
13

Nello script Bash, qual è la differenza tra i seguenti frammenti?Script Bash se istruzioni

1) con staffe singole:

if [ "$1" = VALUE ] ; then 
# code 
fi 

2) usando una doppia parentesi

if [[ "$1" = VALUE ]] ; then 
# code 
fi 
+0

[domanda Simile] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

risposta

8

Il costrutto [[]] è la versione Bash più versatile di []. Questo è il comando di test esteso, adottato da ksh88.

Utilizzando la [[...]] prova costrutto, piuttosto che [...] può prevenire molti errori logici negli script. Ad esempio, il & &, ||, <, e> operatori lavorano all'interno di un test [[]], pur dando un errore all'interno costrutto [].

More info on the Advanced Bash Scripting Guide.

Nei tuoi frammenti, non c'è alcuna differenza come non si sta utilizzando una delle funzioni aggiuntive.

1

Utilizzando [[ sopprime la normale espansione wordsplitting e il percorso sul espressione fra parentesi. Consente inoltre un numero di operazioni di aggiunta, ad esempio la corrispondenza di modelli

2

[ è un built-in bash, [[ è una parola chiave. Vedi lo bash FAQ. Attenzione: la maggior parte degli script di bash su Internet sono crap (non funzionano con nomi di file con spazi, introducono buchi di sicurezza nascosti, ecc.) E bash è molto più difficile da padroneggiare di quanto si possa pensare. Se si desidera eseguire la programmazione bash, è necessario studiare almeno lo bash guide e lo bash pitfalls.

0

Just in è necessario portabilità caso:

Per la portabilità test è possibile ottenere la Bourne shell tramite il progetto Heirloom o:

http://freshmeat.net/projects/bournesh

(In Mac OS X, per esempio,/bin/sh c'è shell Bourne puro.)

0

che è anche un programma esterno, che non significa che non è un comando incorporato.

which [ 
/usr/bin/[ 

In singole parentesi quadre si devono utilizzare per -lt 'meno di' alias < mentre il resto si potrebbe usare <

if [ 3 -lt 4 ] ; then echo yes ; fi 
yes 
if [ 3 < 4 ] ; then echo yes ; fi 
bash: 4: No such file or directory 
if [[ 3 < 4 ]] ; then echo yes ; fi 
yes 
if [[ 3 -lt 4 ]] ; then echo yes ; fi 
yes 

4: mezzi Nessun file, tenta di leggere da un file denominato "4" - reindirizzamento stdin < Lo stesso per> e stdout.