¿Cuándo se requieren corchetes en una declaración if de Bash?

Resuelto Misha Moroshko asked hace 12 años • 3 respuestas

Por lo general, uso corchetes en la declaración if:

if [ "$name" = 'Bob' ]; then ...

Pero, cuando compruebo si greptuve éxito, no uso los corchetes:

if grep -q "$text" $file ; then ...

¿ Cuándo son necesarios los corchetes en la ifdeclaración?

Misha Moroshko avatar Jan 20 '12 05:01 Misha Moroshko
Aceptado

Los corchetes son sinónimos del testcomando. Una ifdeclaració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. testes un comando que toma una expresión y la evalúa:

if test "$name" = 'Bob'; then ...

Dado que los corchetes son sinónimos del testcomando, puedes reescribirlo como tu declaración original:

if [ "$name" = 'Bob' ]; then ...
chepner avatar Jan 19 '2012 22:01 chepner

[es en realidad un comando, equivalente (casi, ver más abajo) al testcomando. 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 ifdeclaración ejecuta un comando y ejecuta la thenparte si el comando tiene éxito, o la elseparte (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 testpara más información.

NOTA AL PIE: Bueno, el [comando es casi equivalente al testcomando. La diferencia es que [requiere ]como último argumento y testno lo permite, y de hecho no lo permite (más precisamente, testno 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).

Keith Thompson avatar Jan 19 '2012 22:01 Keith Thompson

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 bashtambién la proporciona [un shell integrado.

De todos modos, para responder a tu pregunta: Lo que ifhace es ejecutar el comando que le das y ver si el valor de retorno es 0o no. Solías [hacer otras comparaciones más interesantes, como comparaciones de cadenas. Ver man [y man bash.

cha0site avatar Jan 19 '2012 22:01 cha0site