Qu'est-ce que ;; faire en sh?

28

Si j'essaye d'exécuter a;;ben sh, j'obtiens cette erreur:

sh: <number>: Syntax error: ";;" unexpected

Si j'essaie, a;;;bj'obtiens la même erreur, pas à la ;;;place de ;;, donc je pense que cela ;;signifie quelque chose, même si je ne sais pas ce que cela signifie.

Voici un exemple:

$ echo A;;echo B
sh: 1: Syntax error: ";;" unexpected
$ echo A;;;echo B
sh: 1: Syntax error: ";;" unexpected
$ echo A; ;echo B
sh: 1: Syntax error: ";" unexpected

Ici, vous pouvez voir que lorsque j'utilise ; ;au lieu de ;;l'erreur est différente, se rapportant au fait que j'ai utilisé ;sans commande auparavant. ;;semble être un opérateur différent, même si je ne sais pas à quoi il s'applique.

EKons
la source
1
Impossible de rechercher sur Google à cause de ;;, et je n'ai pas trouvé de dupe ici.
EKons
3
Googled "sh double semicolon" ... stackoverflow.com/questions/16905183/…
muru
@muru Bien que pas encore publié ici, je pense.
EKons
@ ΈρικΚωνσταντόπουλος C'est ce que SymbolHound est pour symbolhound.com
Joe

Réponses:

47

;;sépare les instructions dans une construction case... esacdans des shells POSIX:

case foo in (a) cmd1; cmd2 ;; (b) cmd3; cmd4; esac

Pour découvrir une commande, vous pouvez exécuter man that-command. Si votre téléavertisseur l'est less, vous pouvez effectuer une recherche dans la page de manuel en appuyant sur /.

Ici, vous exécutez man shet recherchez ;;. Certains shells prennent en charge d'autres opérateurs pour séparer les caseinstructions (comme ;&dans ksh93/ zsh/ bash/ mksh, &|dans zsh/ mksh, ;;&dans bash).

Stéphane Chazelas
la source
1
Je viens de poster ici parce que je pense qu'il devrait y avoir une telle question ici de toute façon, car ici, cela pourrait être expliqué de manière plus claire si quelqu'un est confus.
EKons
2
S'il y a beaucoup de hits, ou si vous ne vous souvenez pas des règles d'échappement pour la recherche avec less, il est parfois pratique de$ man bash|grep -C1 ';;'
unhammer
Vous ne devriez pas avoir (avant a)et b), et vous avez besoin ;;aprèscmd4
Barmar
@Barmar, cette syntaxe est POSIX. Dans le shell Bourne, vous avez dû omettre le (effet, mais vous n'avez toujours pas eu besoin du ;;précédent esac(bien que cela n'ait pas nui).
Stéphane Chazelas
Merci. Je ne savais pas ce changement dans le shell POSIX, ou que le dernier ;;était facultatif.
Barmar