¿Cuándo se requieren corchetes en una statement Bash if?

Por lo general, uso corchetes en la statement if:

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

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

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

¿Cuándo son necesarios los corchetes en la statement if ?

Los corchetes son un sinónimo para el comando de test . Una instrucción if verifica el estado de salida de un comando para decidir qué twig tomar. grep -q "$text" es un comando, pero "$name" = 'Bob' no es, es solo una expresión. test es un comando que toma una expresión y la evalúa:

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

Como los corchetes son sinónimo del comando de test , puede reescribirlo como su enunciado original:

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

[ es en realidad un comando, equivalente (casi, ver más abajo) al comando de test . No es parte de la syntax del shell. (Tanto [ como la test , dependiendo del shell, a menudo también son comandos incorporados, pero eso no afecta su comportamiento, excepto tal vez por el rendimiento).

Una instrucción if ejecuta un comando y ejecuta la parte then si el comando tiene éxito, o la parte else (si corresponde) 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ía ejecutar ese mismo comando directamente, sin el if ).

En

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

el comando es

 grep -q "$text" $file 

man [ u man test para más información.

NOTA AL PIE: Bueno, el [ comando es casi equivalente al comando de test . La diferencia es que [ requiere ] como último argumento, y la test no lo hace, y de hecho no lo permite. (No tenía que implementarse de esa manera, pero un [ sin un emparejamiento ] habría puesto a mucha gente muy nerviosa.)

La mejor manera de pensar en la [ ... ] syntax es considerar [ ser un progtwig, ¡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 proporciona [ como un shell incorporado.

De todos modos, para responder a su pregunta: ¿Qué pasa if ejecuta el comando que le da y ver que el valor de retorno es 0 o no? Usas [ para hacer otras comparaciones más interesantes, como las comparaciones de cadenas. Ver man [ y man bash .