¿Cuándo se requieren corchetes en una declaración if de Bash?
Por lo general, uso corchetes en la declaración if:
if [ "$name" = 'Bob' ]; then ...
Pero, cuando compruebo si grep
tuve éxito, no uso los corchetes:
if grep -q "$text" $file ; then ...
¿ Cuándo son necesarios los corchetes en la if
declaración?
Los corchetes son sinónimos del test
comando. Una if
declaración verifica el estado de salida de un comando para decidir qué rama tomar. grep -q "$text"
es una orden, pero "$name" = 'Bob'
no lo es: es sólo una expresión. test
es un comando que toma una expresión y la evalúa:
if test "$name" = 'Bob'; then ...
Dado que los corchetes son sinónimos del test
comando, puedes reescribirlo como tu declaración original:
if [ "$name" = 'Bob' ]; then ...
[
es en realidad un comando, equivalente (casi, ver más abajo) al test
comando. No es parte de la sintaxis del shell. (Ambos [
y test
, dependiendo del shell, a menudo también son comandos integrados, pero eso no afecta su comportamiento, excepto quizás el rendimiento).
Una if
declaración ejecuta un comando y ejecuta la then
parte si el comando tiene éxito, o la else
parte (si la hay) si falla. (Un comando tiene éxito si sale con un estado ( $?
) de 0, falla si sale con un estado distinto de cero).
En
if [ "$name" = 'Bob' ]; then ...
el comando es
[ "$name" = 'Bob' ]
(Podrías ejecutar el mismo comando directamente, sin el archivo if
.)
En
if grep -q "$text" $file ; then ...
el comando es
grep -q "$text" $file
man [
o man test
para más información.
NOTA AL PIE: Bueno, el [
comando es casi equivalente al test
comando. La diferencia es que [
requiere ]
como último argumento y test
no lo permite, y de hecho no lo permite (más precisamente, test
no trata un ]
argumento de manera especial; por ejemplo, podría ser un nombre de archivo válido). (No tenía por qué implementarse de esa manera, pero [
sin una coincidencia ]
habría puesto muy nerviosa a mucha gente).
La mejor manera de pensar en la [ ... ]
sintaxis es considerarla [
como un programa, ¡y lo es!
Mira esto:
~ $ ls /usr/bin/\[
/usr/bin/[
por otro lado, probablemente no estés usando esa versión, ya que bash
también la proporciona [
un shell integrado.
De todos modos, para responder a tu pregunta: Lo que if
hace es ejecutar el comando que le das y ver si el valor de retorno es 0
o no. Solías [
hacer otras comparaciones más interesantes, como comparaciones de cadenas. Ver man [
y man bash
.