[
El comando devuelve el estado de salida cero si la expresión, contenida en sus argumentos, se considera verdadera y el estado de salida distinto de cero si la expresión, contenida en sus argumentos, se considera falsa. También falla con el mensaje de error si su último argumento no lo es ]
(esto se hace únicamente por razones estéticas).
P.ej:
[ hello ]
echo "Exit-status of [ hello ] is:" $?
[ abc = abc ]
echo "Exit-status of [ abc = abc ] is:" $?
[ ]
echo "Exit-status of [ ] is:" $?
[ abc = def ]
echo "Exit-status of [ abc = def ] is:" $?
... dará salida:
El estado de salida de [hola] es: 0 - porque la cadena no vacía se considera verdadera
El estado de salida de [abc = abc] es: 0 - porque 'abc' realmente es lo mismo que 'abc'
El estado de salida de [] es : 1 - porque la cadena vacía se considera falsa
El estado de salida de [abc = def] es: 1 - porque 'abc' realmente difiere de 'def'
Sin embargo, bash y muchos otros shells generalmente no invocan /bin/[
(o /usr/bin/[
) en estos casos, sino que llaman al comando incorporado con exactamente el mismo comportamiento (solo por razones de rendimiento). Para invocar /bin/[
(no el sustituto incorporado del shell) debe especificar explícitamente su ruta (p /bin/[ hello ]
.]
Ej ., No necesita prefijar con dirname aunque ☺ ), o configurar el shell para que no use un sustituto incorporado (por ejemplo, enable -n [
en bash).
PD: Como se dijo en otras respuestas, [
está relacionado con test
. Pero test
, a diferencia [
, no requiere ]
como último argumento (y no lo espera en absoluto; agregar más ]
a los test
argumentos puede hacer que falle con un mensaje de error o que devuelva un resultado incorrecto) . El /bin/test
y /bin/[
puede resolverse en el mismo archivo (p. Ej., Uno está enlazado a un enlace simbólico ; en este caso, el desvío de comportamiento probablemente se implementa analizando el comando actualmente llamado dentro del propio código test
/ [
) o en diferentes archivos. Para test
, el shell también generalmente invoca un sustituto incorporado, a menos que la ruta se especifique explícitamente ( /bin/test
) o esté configurada para no hacerlo (enable -n test
)
PPS: a diferencia de test
y [
, moderno if
nunca es un archivo real. Es parte de la sintaxis de shell (por ejemplo, bash): if commandA; then commandB; fi
(se pueden usar nuevas líneas en lugar de punto y coma) hace commandB
que se ejecute si y solo si commandA
sale con estado cero. Esto se adapta perfectamente al comportamiento de test
o [
, lo que permite combinarlos como if [ "$a" = foo ]; then …; fi
(o if test "$a" = foo; then …; fi
, simplemente, menos legibles) . Sin embargo, los scripts modernos a menudo usan en [[
lugar de test
o [
, que (como el if
) nunca es un archivo real, sino que siempre es parte de la sintaxis de shell.
PPPS: En cuanto a man
, nunca espere man
tener un artículo sobre cada comando en su sistema de archivos. Información sobre algo de información (incluso "real", basada en archivos) comandos pueden faltar, en algunos shell empotrados puede estar presente no sólo en un artículo dedicado a la cáscara específica (que es el lugar en el que sin duda encontrará información sobre test
, [
, if
, [[
). Aún así, muchas distribuciones tienen artículos explícitos man
para test
y [
. (Acerca de --help
, no se reconoce test
por razones obvias: necesita manejar en silencio casos como a=--help; test "$a"
; en algunas distribuciones [ --help
(sin cerrar ]
) todavía muestra ayuda, en algunos no lo hace).
[
refiere altest
comando, noexpr
, así que debería serloman test