Punto e virgola superfluo alla fine di una riga negli script di shell?


103

Ho uno script di shell che contiene quanto segue:

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;

I punti e virgola sono completamente superflui nello snippet sopra? E c'è qualche motivo per cui alcune persone usano il doppio punto e virgola?

Sembra che i punti e virgola siano solo un separatore, qualcosa che useresti invece di una nuova riga.

Risposte:


150

I singoli punti e virgola alla fine di una riga sono superflui, poiché la nuova riga è anche un separatore di comandi. casenecessita specificamente del doppio punto e virgola alla fine dell'ultimo comando in ogni blocco di pattern; vedere help caseper i dettagli.


20
Grande! Quindi, se ti ho capito bene, posso rimuovere in sicurezza ogni singolo punto e virgola alla fine di qualsiasi riga, ma mai il doppio?
Nagel

29

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

Quindi, ;può essere metacarattere o operatore di controllo, mentre ;;è sempre un operatore di controllo (in caso di comando).

Nel tuo codice particolare, tutto ;alla fine della riga non è necessario. Tuttavia ;;è necessario.


4
Qual è la differenza pratica tra ;e ;;, allora? Non ho abbastanza familiarità con l'analisi della sintassi BASH per conoscere la differenza pratica tra ciò che BASH chiama un "metacarattere" e ciò che chiama un "operatore di controllo".
jvriesem

1
d'accordo con le domande e i commenti di jvriesem, lo snippet dei documenti sembra un po 'troppo ristretto
grgry

6

Nel caso speciale di find, ;viene utilizzato per terminare i comandi invocati da -exec. Vedi la risposta di @kenorb a questa domanda .


0

@ Opensourcebook-Amit

le nuove righe equivalenti al punto e virgola singolo ;sul terminale o nello script della shell.

Vedere gli esempi seguenti:

Sul terminale:

[root@server test]# ls;pwd;

Nello script di shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Ma non sono d'accordo con il commento che &equivale a una nuova riga o un singolo punto e virgola

& viene eseguito comandi in background anche un separatore di comandi ma non ha funzionato come punto e virgola o nuova riga.


-2

@Ignacio Vazquez-Abrams

In realtà questo non è completamente accurato, i singoli punti e virgola alla fine di una riga non sono superflui e sicuramente non sono la stessa cosa delle nuove righe.

Dal manuale di riferimento di Bash

Comandi separati da un ";" vengono eseguiti in sequenza; la shell attende che ogni comando termini a turno. Lo stato di ritorno è lo stato di uscita dell'ultimo comando eseguito.

I comandi separati da "nuova riga" potrebbero essere eseguiti in parallelo quando i comandi separati da punto e virgola vengono sempre eseguiti in sequenza


5
Questo è falso. Non c'è differenza. Se leggete correttamente la stessa sezione del manuale, vedrete questo, solo poche righe sopra: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Quindi ciò che avete citato sul punto e virgola si applica allo stesso modo ai newline.
underscore_d

1
Sono d'accordo che questa frase sia ambigua, penso che ciò che l'autore intendesse dire sia ";" e "\ n" possono essere usati più di una volta per separare i comandi ma non che stiano facendo la stessa cosa. Ho trovato questo collegamento: unix.stackexchange.com/questions/53390/… Inoltre non lo sapevo prima di avere effettivamente un problema con uno script che ho scritto e ho notato la differenza tra ";" e "\ n" da un mio collega. Sfortunatamente, è stato molto tempo fa e non ricordo cosa significasse pubblicare un esempio qui.
IJ

2
se leggessi il post che hai linkato a @IJ vedresti che il parallelismo deriva dal &non dal \n. In un commento si afferma che può saltare il punto e virgola perché apparentemente &è anche un separatore di comandi proprio come ;e \n.
Matthias
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.