Punto y coma en estructuras condicionales

35

¿Por qué poner punto y coma en uno y no en otro?

El resultado es el mismo

Código uno

if [ "a" == "a" ]
then
 echo "true"
fi

Código dos

if [ "a" == "a" ];
then
 echo "true";
fi

Los punto y coma en el segundo código son innecesarios?

¿Cuándo es necesario colocar punto y coma?

Jhonathan
fuente
2
Esto ha sido respondido suficiente y adecuadamente, pero quería que el OP también lo supiera; simplemente reemplaza cualquier final de línea, para que pueda combinar dos comandos en una sola línea, por ejemplo:svn up; make
Aaron D. Marasco el
1
Tenga en cuenta también que ;;se utilizan dos puntos y coma para separar las coincidencias en las declaraciones de caso. ;;se requiere aquí, no es opcional ... pero ;;no es lo mismo que ;o ; ;, simplemente se parece un poco. Los punto y coma simples ;funcionan normalmente en las partes de COMANDOS de las declaraciones de un caso.
cas

Respuestas:

31

El punto y coma se necesita solo cuando falta el final de la línea:

if [ "a" == "a" ] ; then echo "true" ; fi

Sin punto y coma, obtienes un error de sintaxis.

No entiendo tu pregunta sobre citas. ¿Puedes ser mas específico?

(Y, por cierto, usar en =lugar de ==es más portátil y compatible con POSIX).

choroba
fuente
¿Las citas en el segundo código son innecesarias?
Jhonathan
2
Todas las citas en ambas muestras son innecesarias.
choroba
6

El punto y coma se usa a menudo, porque a algunas personas (/ me, por ejemplo) les gusta un estilo como este:

if [ ... ]; then
   doit-it-then
else
   doit-it-else
fi

Entonces, si la palabra clave then se coloca en la línea de condición, entonces es necesaria porque se inicia un nuevo comando, como lo escribió choroba.

Con respecto a las comillas en la verificación de condición, a menudo se usan con variables para asegurarse de que no ocurra ninguna excepción si no se asigna nada a la variable. Este es un estilo más seguro y parece innecesario, pero incluso en la programación de shell ha hecho que los programas se procesen de vez en cuando, aunque los contenidos no pueden asignarse a variables. Entonces el comando sigue funcionando porque se compara una cadena vacía.

lobo
fuente