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.)