2010-04-14 22 views
13

En la secuencia de comandos Bash, ¿cuál es la diferencia entre los siguientes fragmentos?Sentencias Bash script if if

1) utilizando soportes individuales:

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

2) utilizando soportes dobles:

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

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

Respuesta

8

El [[]] constructo es la versión Bash más versátil de []. Este es el comando de prueba extendido, adoptado de ksh88.

Usar la construcción de prueba [[...]], en lugar de evitar muchos errores de lógica en las secuencias de comandos. Por ejemplo, los operadores & &, ||, < y> trabajan dentro de una prueba [[]], a pesar de dar un error dentro de una construcción [].

More info on the Advanced Bash Scripting Guide.

En los fragmentos, no hay diferencia, ya que no está utilizando ninguna de las funciones adicionales.

1

Al utilizar [[ se suprime la expansión normal de palabras y la ruta de acceso en la expresión entre corchetes. También permite una serie de operaciones adicionales, como la coincidencia de patrones

2

[ es una palabra clave incorporada, [[. Vea el bash FAQ. Cuidado: la mayoría de los scripts bash en Internet son basura (no funcionan con nombres de archivos con espacios, presentan agujeros de seguridad ocultos, etc.), y bash es mucho más difícil de dominar de lo que uno podría pensar. Si quieres hacer la programación bash, debes estudiar al menos bash guide y bash pitfalls.

0

Sólo se requiere el portabilidad caso:

Para un transporte prueba se puede obtener el shell Bourne a través del proyecto de la herencia o:

http://freshmeat.net/projects/bournesh

(En Mac OS X, por ejemplo,/bin/sh no es puro Bourne shell.)

0

que también es un programa externo, lo que no significa que no sea un built-in.

which [ 
/usr/bin/[ 

En corchetes individuales que hay que utilizar para -lt 'menor que' alias < mientras que de lo contrario podría utilizar <

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: No existe el fichero medios, intenta leer desde una archivo llamado "4" - redirigiendo stdin < Lo mismo para> y stdout.

Cuestiones relacionadas