511 votos

¿Cuál es la diferencia entre individuales y dobles corchetes en bash?

Sólo me preguntaba qué es exactamente la diferencia entre

[[ $STRING != foo ]]

y

[ $STRING != foo ]

es decir, aparte de que el último es compatible con posix, en los peces y el primero es una extensión encontrado en bash.

360voto

Kyle Brandt Puntos 50907

Hay varias diferencias. En mi opinión, algunos de los más importantes son:

  1. [ es un builtin en Bash y muchos otros moderno conchas. El grupo builtin [ es similar a la prueba con el requisito adicional de un cierre ]. El builtins [ y la prueba de imitar la funcionalidad /bin/[ y /bin/test junto con sus limitaciones, de modo que las secuencias de comandos sería compatible. El original ejecutables todavía existen principalmente para la compatibilidad con POSIX y compatibilidad hacia atrás. Ejecutando el comando type [ en Bash indica que [ se interpreta como un builtin por defecto. (Nota: which [ sólo busca los ejecutables en el CAMINO y es equivalente a type -P [)
  2. [[ no es tan compatible, por lo general, no funcionan con lo /bin/sh puntos. Por lo [[ es el más moderno bash / zsh / korn opción.
  3. Porque [[ está integrado en el shell y no han legado los requisitos, usted no necesita preocuparse acerca de la palabra de división basada en el IFS variable lío en las variables que se evalúan en una cadena de caracteres con espacios. Por lo tanto, usted realmente no necesita para poner la variable entre comillas dobles.

Para la mayor parte, el resto es sólo algunos de los más agradables de la sintaxis. Para ver más diferencias, recomiendo este enlace de preguntas frecuentes respuesta: ¿Cuál es la diferencia entre la prueba, [ y [[ ?. De hecho, si usted es serio acerca de bash scripting, recomiendo la lectura de la totalidad de la wiki, incluyendo las preguntas más frecuentes, las Trampas, y Guía. La sección de prueba de la sección de la guía explica estas diferencias así, y por qué el autor(s) pensar [[ es una mejor opción si usted no necesita preocuparse acerca de ser portátil. Las principales razones son:

  1. Usted no tiene que preocuparse acerca de citar el lado izquierdo de la prueba, para que se lea como una variable.
  2. Usted no tiene que salir de menor que y mayor < > con barras diagonales inversas en orden para ellos, no para obtener evaluado como redirección de entrada, que puede estropear algunas cosas por encima de la escritura de archivos. Esto vuelve otra vez a [[ ser un builtin. Si [ (test) es un programa externo de la concha tendría que hacer una excepción en la forma en que se evalúa < y > sólo si /bin/test se llama, que en realidad tampoco tendría sentido.

152voto

abhiomkar Puntos 443

En Resumen:

[ ] son bash Builtins

[[ ]] bash palabras clave

Palabras clave: las palabras clave son bastante como builtins, pero la principal diferencia es que las especiales reglas de análisis se aplican a ellos. Por ejemplo, [ es un bash builtin, mientras que [[ es una fiesta de la palabra clave. Ambos son utilizados para probar cosas, pero desde [[ es una palabra clave en lugar de un builtin, se beneficia de un par de especial análisis de las reglas que hacen que sea mucho más fácil:

  $ [ a < b ]
 -bash: b: No such file or directory
  $ [[ a < b ]]

El primer ejemplo se devuelve un error porque bash intenta redirigir el archivo b para el comando [ a ]. El segundo ejemplo hace realmente lo que esperas de él. El carácter < ya no tiene su significado especial de Archivo operador de Redirección.

Fuente: http://mywiki.wooledge.org/BashGuide/CommandsAndArguments

7voto

Ryan Sampson Puntos 2898

Basado en una rápida lectura de las secciones pertinentes del manual, la principal diferencia parece ser que la == y != operadores partido contra un patrón, en lugar de una cadena literal, y también que no es la =~ regex operador de comparación.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: