Ponto-e-vírgula supérfluo no final de uma linha em scripts de shell?

103

Eu tenho um script de shell que contém o seguinte:

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;

Os pontos-e-vírgulas são completamente supérfluos no snippet acima? E há alguma razão para algumas pessoas usarem ponto-e-vírgula duplo?

Parece que o ponto-e-vírgula é apenas um separador, algo que você usaria em vez de uma nova linha.

Nagel
fonte

Respostas:

150

O ponto-e-vírgula único no final de uma linha é supérfluo, pois a nova linha também é um separador de comando. caseprecisa especificamente de ponto-e-vírgula duplo no final do último comando em cada bloco de padrão; veja help casepara detalhes.

Ignacio Vazquez-Abrams
fonte
20
Ótimo! Então, se bem entendi, posso remover com segurança qualquer ponto-e-vírgula único no final de qualquer linha, mas nunca o dobro?
Nagel,
29

De acordo com 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>

Portanto, o ;pode ser um metacaractere ou operador de controle, enquanto o ;;é sempre um operador de controle (no caso de comando).

Em seu código específico, ;nem tudo no final da linha é necessário. No ;;entanto, é necessário.

Michał Šrajer
fonte
4
Qual é a diferença prática entre ;e ;;, então? Não estou familiarizado o suficiente com a análise sintática do BASH para saber a diferença prática entre o que o BASH chama de "metacaractere" e o que ele chama de "operador de controle".
jvriesem de
1
concordar com as perguntas e comentários de jvriesem, o snippet de documentos parece um pouco restrito
grgry
6

No caso especial de find, ;é usado para encerrar comandos invocados por -exec. Veja a resposta de @kenorb para esta pergunta .

DanielGKiel
fonte
0

@ Opensourcebook-Amit

newlines equivalente a um único ponto ;- e - vírgula no terminal ou no script de shell.

Veja os exemplos abaixo:

No terminal:

[root@server test]# ls;pwd;

No script de shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Mas não concordo com o comentário que &equivale a nova linha ou ponto-e-vírgula único

& é executar comandos em segundo plano também um separador de comandos, mas não funcionou como ponto e vírgula ou nova linha.

Amit Ganvir
fonte
-2

@Ignacio Vazquez-Abrams

Na verdade, isso não é totalmente preciso, ponto-e-vírgula único no final de uma linha não é supérfluo e definitivamente não é a mesma coisa que novas linhas.

Do Manual de Referência Bash

Comandos separados por ';' são executados sequencialmente; o shell espera que cada comando termine sucessivamente. O status de retorno é o status de saída do último comando executado.

Os comandos separados por "nova linha" podem ser executados em paralelo quando os comandos separados por ponto e vírgula são sempre executados sequencialmente

EU J
fonte
5
Isto é falso. Não há diferença. Se você ler a mesma seção do manual corretamente, verá isso, apenas algumas linhas acima: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Portanto, o que você citou sobre o ponto-e-vírgula se aplica igualmente às novas linhas.
sublinhado_d
1
Concordo que esta frase é ambígua, acho que o que o autor quis dizer é que ";" e "\ n" podem ser usados ​​mais de uma vez para separar comandos, mas não que eles estejam fazendo a mesma coisa. Encontrei este link: unix.stackexchange.com/questions/53390/… Eu também não sabia disso antes de realmente ter um problema com algum script que escrevi e foi notado sobre a diferença entre ";" e "\ n" por um de meus colegas. Infelizmente, isso foi há muito tempo e não me lembro o que era postar um exemplo aqui.
IJ
2
se você lesse o post que você vinculou a @IJ, veria que o paralelismo vem do &não do \n. Em um comentário, afirma-se que ele pode pular o ponto-e-vírgula porque, aparentemente, &também é um separador de comandos, assim como ;e \n.
Matthias