Los corchetes son una notación abreviada para realizar una prueba condicional. Los corchetes [
, así como [[
son comandos reales dentro de Unix, lo crea o no.
Piense:
$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file
En Bash, el [
es un comando incorporado y también un ejecutable. [[
es solo una palabra clave para Bash.
Ejemplo
Puede confirmar esto usando type
:
$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword
Puede ver el ejecutable físico aquí:
$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
builtins vs . palabras clave
Si echa un vistazo a la página de manual de Bash, man bash
, encontrará las siguientes definiciones para el 2:
-
palabras clave – Las palabras reservadas son palabras que tienen un significado especial para el shell. Las siguientes palabras son reconocido como reservado cuando no está entre comillas y la primera palabra de un comando simple (ver SHELL GRAMMAR a continuación) o la tercera palabra de un caso o para el comando:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins – Si el nombre del comando no contiene barras, el shell intenta localizarlo. Si hay existe una función de shell con ese nombre, esa función se invoca como se describe anteriormente en F UNCIONES. Si el nombre no coincide con una función, el shell la busca en la lista de elementos internos del shell. Si se encuentra una coincidencia, se invoca esa función incorporada.
Si el nombre no es una función de shell ni una función incorporada, y no contiene barras, bash busca en cada elemento de la RUTA un directorio que contenga un archivo ejecutable por ese nombre. Bash usa una tabla hash para recordar los nombres de ruta completos de los archivos ejecutables (ver hash en SHELL BUILTIN COMMANDS a continuación). Se realiza una búsqueda completa de los directorios en PATH solo si el comando no se encuentra en la tabla hash. Si la búsqueda no tiene éxito, el shell busca una función de shell definida denominada command_not_found_handle. Si esa función existe, se invoca con el comando original y los argumentos del comando original como sus argumentos, y el estado de salida de la función se convierte en el estado de salida del shell. Si esa función no está definida, el shell imprime un mensaje de error y devuelve un estado de salida de 127.
página man
Si mira a través de En la página de manual de Bash encontrará los detalles.
test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
Por último, desde la página de manual:
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
EDIT # 1
Pregunta de seguimiento del OP.
Ok, entonces ¿por qué hay un ¿Necesita un «si» entonces? Quiero decir, ¿por qué «si» incluso existe si «[» sería suficiente.
El if
es parte de un condicional. El comando test
o [ ... ]
simplemente evalúa el condicional y devuelve un 0 o a 1. La declaración if actúa sobre el 0 o el 1. Los 2 funcionan juntos cuando los usa.
Ejemplo
if [ ... ]; then ... do this ... else ... do that ... fi
Comentarios
- Bien, entonces, ¿por qué es necesario un " si " entonces? yo yo an, ¿por qué " si " incluso existe si " [" sería suficiente.
- Little nitpick:
[[
también puede ser un shell incorporado.
- @supertonsky – funcionan pero solo devuelven el estado de la prueba, no pueden ' actuar sobre ella de ninguna manera. El
if
actúa como un interruptor y ejecuta los comandos en el bloque then
o no dependiendo de los resultados devueltos por el condicional. if
no es ' t realmente opcional en la forma en que ' estás pensando, los ejemplos mostró el uso &&
que es como if
. Si el condicional falla, entonces el comando después de &&
aren ' t se ejecuta.
- @SteveKoch – como yo Entiéndalo,
]
es un argumento en este contexto para el comando [
.Yo ' supongo que hay, pero no puedo ' pensar en ninguno que se me ocurra. Podría valer la pena publicarlo como otra Q si ' eres realmente curioso.
- @SteveKoch – por cierto,
/usr/bin/[
se muestra como parte de las coreutils en mi sistema Fedora. Siempre puede consultar la fuente sobre estos asuntos si desea saber exactamente cómo funcionan tales cosas. git.savannah.gnu.org/cgit/coreutils.git
¡¡Ooohh, uno de mis temas favoritos !!
Los corchetes son sinónimo del comando «test». Si lee la página del manual de prueba, verá que puede invocar el comando de prueba como
test -r /etc/profile.d/java.sh
o
[ -r /etc/profile.d/java.sh ]
Los espacios entre los corchetes y el material dentro y fuera de ellos son obligatorios.
El comando» test «en este caso es verificar si el archivo / etc / profile.d / java.sh es legible para el usuario actual. Implícito es una verificación para ver si existe, por supuesto. 🙂
El &&
es un atajo de sintaxis bash para «si el comando de la izquierda tiene éxito, entonces ejecute el comando de la derecha. Entonces, este comando compuesto es una forma abreviada de un «si-entonces» que se vería así:
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
Ahora, también encontrará corchetes dobles explicado en la página de manual de bash. Esas son una versión interna de bash de una función de prueba extendida. Tenga en cuenta que no son exactamente lo mismo. Hay cosas que puede hacer con las que no puede hacer con el comando «test» y su » [«sinónimo.
Comentarios
- Solo quiero asegurarme de que lo entiendo. Si los corchetes son un alias para " test ", no debería ' t su segundo ejemplo sea " [- r /etc/profile.d/java.sh] "? En otras palabras, elimine la declaración de prueba redundante.
- Sí, pmont, usted ' es exactamente correcto, por supuesto. No fui ' t cuidadoso cuando corté y pegué. I ' lo he arreglado. ¡Gracias!