bash - microsoft - visual studio community
¿Cuándo se requieren corchetes en una declaración Bash if? (3)
Por lo general, uso corchetes en la declaración 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 declaración if ?
La mejor manera de pensar en la [ ... ] sintaxis es considerar [ ser 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 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 .
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é rama 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 sintaxis 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.)