Les points-virgules sont superflus à la fin d'une ligne dans les scripts shell?

103

J'ai un script shell qui contient les éléments suivants:

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;

Les points - virgules sont - ils complètement superflus dans l'extrait ci-dessus? Et y a-t-il une raison pour laquelle certaines personnes utilisent des points-virgules doubles?

Il semble que les points-virgules ne soient qu'un séparateur, quelque chose que vous utiliseriez à la place d'une nouvelle ligne.

Nagel
la source

Réponses:

150

Les points-virgules simples à la fin d'une ligne sont superflus, car la nouvelle ligne est également un séparateur de commandes. casea spécifiquement besoin de doubles points-virgules à la fin de la dernière commande dans chaque bloc de motif; voir help casepour plus de détails.

Ignacio Vazquez-Abrams
la source
20
Génial! Donc, si je vous comprends bien, je peux supprimer en toute sécurité tous les points-virgules simples à la fin de n'importe quelle ligne, mais jamais les doubles?
Nagel le
29

Selon 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>

Ainsi, le ;peut être un méta-caractère ou un opérateur de contrôle, tandis que le ;;est toujours un opérateur de contrôle (dans la commande case).

Dans votre code particulier, tout ;ce qui est en fin de ligne n'est pas nécessaire. Le ;;est cependant nécessaire.

Michał Šrajer
la source
4
Quelle est alors la différence pratique entre ;et ;;? Je ne suis pas assez familier avec l'analyse syntaxique de BASH pour connaître la différence pratique entre ce que BASH appelle un «métacaractère» et ce qu'il appelle un «opérateur de contrôle».
jvriesem
1
d'accord avec les questions et commentaires de jvriesem, l'extrait de docs semble un peu trop étroit
grgry
6

Dans le cas particulier de find, ;est utilisé pour terminer les commandes appelées par -exec. Voir la réponse de @kenorb à cette question .

DanielGKiel
la source
0

@ Opensourcebook-Amit

les retours à la ligne équivalent à un point-virgule unique ;sur le terminal ou dans le script shell.

Voir les exemples ci-dessous:

Sur le terminal:

[root@server test]# ls;pwd;

Sur le script shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Mais je ne suis pas d'accord avec le commentaire qui &équivaut à une nouvelle ligne ou à un point-virgule unique

& est exécuter des commandes en arrière-plan également un séparateur de commande mais ne fonctionne pas comme point-virgule ou nouvelle ligne.

Amit Ganvir
la source
-2

@Ignacio Vazquez-Abrams

En fait, ce n'est pas tout à fait exact, les points-virgules simples à la fin d'une ligne ne sont pas superflus et ne sont certainement pas la même chose que les nouvelles lignes.

À partir du manuel de référence de Bash

Commandes séparées par un ';' sont exécutés séquentiellement; le shell attend que chaque commande se termine à son tour. L'état de retour est l'état de sortie de la dernière commande exécutée.

Les commandes séparées par une "nouvelle ligne" peuvent être exécutées en parallèle lorsque les commandes séparées par un point-virgule sont toujours exécutées séquentiellement

IJ
la source
5
C'est faux. Il n'y a pas de différence. Si vous lisez correctement la même section du manuel, vous verrez ceci, juste quelques lignes ci-dessus: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Donc ce que vous avez cité à propos du point-virgule s'applique également aux retours à la ligne.
underscore_d
1
Je conviens que cette phrase est ambiguë, je pense que l'auteur voulait dire ";" et "\ n" peuvent tous deux être utilisés plus d'une fois pour séparer des commandes mais pas qu'ils font la même chose. J'ai trouvé ce lien: unix.stackexchange.com/questions/53390/ ... Je ne le savais pas non plus avant d'avoir en fait un problème avec un script que j'ai écrit et que j'ai noté à propos de la différence entre ";" et "\ n" par un de mes collègues. Malheureusement, c'était il y a longtemps et je ne me souviens plus de ce que c'était d'afficher un exemple ici.
IJ
2
si vous lisiez le post que vous avez lié à @IJ, vous verriez que le parallélisme vient du &non pas le \n. Dans un commentaire, il est indiqué qu'il peut ignorer le point-virgule car, apparemment, &est également un séparateur de commande tout comme ;et \n.
Matthias