¿Son superfluos los puntos y comas al final de una línea en los scripts de shell?

103

Tengo un script de shell que contiene lo siguiente:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

¿Son completamente superfluos los puntos y comas en el fragmento de arriba? ¿Y hay alguna razón para que algunas personas usen punto y coma dobles?

Parece que los puntos y comas son solo un separador, algo que usaría en lugar de una nueva línea.

Nagel
fuente

Respuestas:

150

Los puntos y comas simples al final de una línea son superfluos, ya que la nueva línea también es un separador de comandos. caseespecíficamente necesita puntos y comas dobles al final del último comando en cada bloque de patrón; consulte help casepara obtener más detalles.

Ignacio Vázquez-Abrams
fuente
20
¡Excelente! Entonces, si lo entiendo correctamente, puedo eliminar con seguridad cualquier punto y coma al final de cualquier línea, pero nunca los dobles.
Nagel
29

Según man bash:

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

Por lo tanto, ;puede ser un metacarácter u operador de control, mientras ;;que siempre es un operador de control (en caso de comando).

En su código particular, ;no son necesarios todos al final de la línea. El ;;embargo se necesita.

Michał Šrajer
fuente
4
¿Cuál es la diferencia práctica entre ;y ;;, entonces? No estoy lo suficientemente familiarizado con el análisis sintáctico de BASH para conocer la diferencia práctica entre lo que BASH llama un "metacarácter" y lo que llama un "operador de control".
jvriesem
1
de acuerdo con las preguntas y comentarios de jvriesem, el fragmento de documentos parece un poco demasiado estrecho
grgry
6

En el caso especial de find, ;se usa para terminar los comandos invocados por -exec. Vea la respuesta de @kenorb a esta pregunta .

DanielGKiel
fuente
0

@ Opensourcebook-Amit

nuevas líneas equivalen a un punto y coma simple ;en la terminal o en el script de shell.

Vea los ejemplos siguientes:

En la terminal:

[root@server test]# ls;pwd;

En el script de shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

Pero no estoy de acuerdo con el comentario que &equivale a una nueva línea o un punto y coma simple

& Los comandos de ejecución en segundo plano también son un separador de comandos, pero no funciona como punto y coma o nueva línea.

Amit Ganvir
fuente
-2

@Ignacio Vázquez-Abrams

En realidad, esto no es completamente exacto, los puntos y comas simples al final de una línea no son superfluos y definitivamente no son lo mismo que las líneas nuevas.

Del manual de referencia de Bash

Comandos separados por un ';' se ejecutan secuencialmente; el shell espera que cada comando termine por turno. El estado de retorno es el estado de salida del último comando ejecutado.

Los comandos separados por "nueva línea" pueden ejecutarse en paralelo cuando los comandos separados por punto y coma siempre se ejecutan de forma secuencial.

IJ
fuente
5
Eso es falso. No hay diferencia. Si lee la misma sección del manual correctamente, verá esto, solo unas pocas líneas arriba: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Entonces, lo que citó sobre el punto y coma se aplica igualmente a las nuevas líneas.
underscore_d
1
Estoy de acuerdo en que esta oración es ambigua, creo que lo que quiso decir el autor es que ";" y "\ n" se pueden usar más de una vez para separar comandos, pero no es que estén haciendo lo mismo. Encontré este enlace: unix.stackexchange.com/questions/53390/… Tampoco sabía esto antes. De hecho, tenía un problema con un script que escribí y se notó la diferencia entre ";" y "\ n" por uno de mis colegas. Desafortunadamente, esto fue hace mucho tiempo y no puedo recordar qué fue publicar un ejemplo aquí.
IJ
2
si leyera la publicación que vinculó a @IJ, vería que el paralelismo proviene del &no \n. En un comentario se dice que puede omitir el punto y coma porque aparentemente, &también es un separador de comando como ;y \n.
Matthias