Średniki są zbędne na końcu wiersza w skryptach powłoki?

103

Mam skrypt powłoki, który zawiera następujące elementy:

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;

Czy w powyższym fragmencie średniki są całkowicie zbędne? Czy jest jakiś powód, dla którego niektórzy ludzie używają podwójnych średników?

Wygląda na to, że średniki są tylko separatorem, czymś, czego użyłbyś zamiast nowego wiersza.

Nagel
źródło

Odpowiedzi:

150

Pojedyncze średniki na końcu wiersza są zbędne, ponieważ znak nowej linii jest również separatorem poleceń. casew szczególności potrzebuje podwójnych średników na końcu ostatniego polecenia w każdym bloku wzoru; zobacz help caseszczegóły.

Ignacio Vazquez-Abrams
źródło
20
Wspaniały! Więc jeśli dobrze Cię rozumiem, mogę bezpiecznie usunąć pojedyncze średniki na końcu dowolnej linii, ale nigdy podwójne?
Nagel
29

Według 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>

Zatem ;może być metaznakiem lub operatorem sterującym, podczas gdy ;;zawsze jest operatorem sterującym (w przypadku polecenia).

W twoim konkretnym kodzie wszystko ;na końcu linii nie jest potrzebne. Jest ;;to jednak potrzebne.

Michał Šrajer
źródło
4
Jaka jest w takim razie praktyczna różnica między ;i ;;? Nie jestem wystarczająco zaznajomiony z analizowaniem składni BASH, aby poznać praktyczną różnicę między tym, co BASH nazywa „metaznakiem”, a tym, co nazywa „operatorem sterującym”.
jvriesem
1
zgadzam się z pytaniami i komentarzami jvriesem, fragment dokumentu wydaje się nieco zbyt wąski
grgry.
6

W specjalnym przypadku find, ;służy do kończenia poleceń wywoływanych przez -exec. Zobacz odpowiedź @kenorb na to pytanie .

DanielGKiel
źródło
0

@ Opensourcebook-Amit

znaki nowej linii są odpowiednikiem pojedynczego średnika ;na terminalu lub w skrypcie powłoki.

Zobacz poniższe przykłady:

Na terminalu:

[root@server test]# ls;pwd;

W skrypcie powłoki:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Ale nie zgadzam się z komentarzem, który &jest odpowiednikiem nowej linii lub pojedynczego średnika

& uruchamia polecenia w tle również jako separator poleceń, ale nie działa jako średnik lub znak nowej linii.

Amit Ganvir
źródło
-2

@Ignacio Vazquez-Abrams

W rzeczywistości nie jest to całkowicie dokładne, pojedyncze średniki na końcu wiersza nie są zbędne i zdecydowanie nie są tym samym, co nowe wiersze.

Z podręcznika Bash Reference Manual

Polecenia oddzielone znakiem „;” są wykonywane sekwencyjnie; powłoka czeka po kolei na zakończenie każdego polecenia. Status powrotu to kod zakończenia ostatniego wykonanego polecenia.

Polecenia oddzielone „nową linią” mogą być wykonywane równolegle, gdy polecenia oddzielone średnikiem są zawsze wykonywane sekwencyjnie

IJ
źródło
5
To nieprawda. Nie ma różnicy. Jeśli dobrze przeczytasz tę samą sekcję podręcznika, zobaczysz to, zaledwie kilka wierszy powyżej: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Więc to, co zacytowałeś o średniku, odnosi się w równym stopniu do nowych linii.
underscore_d
1
Zgadzam się, że to zdanie jest niejednoznaczne, myślę, że autor miał na myśli to, że ";" i "\ n" można użyć więcej niż jeden raz do oddzielenia poleceń, ale nie oznacza to, że robią to samo. Znalazłem ten link: unix.stackexchange.com/questions/53390/…. Również nie wiedziałem o tym, zanim faktycznie miałem problem z jakimś skryptem, który napisałem i zauważono różnicę między ";" i „\ n” przez jednego z moich kolegów. Niestety to było dawno temu i nie pamiętam, jak to było zamieścić tutaj przykład.
IJ
2
jeśli przeczytasz post, do którego utworzyłeś link do @IJ, zobaczysz, że paralelizm pochodzi od &nie \n. W komentarzu jest napisane, że może pominąć średnik, ponieważ najwyraźniej &jest również separatorem poleceń, podobnie jak ;i \n.
Matthias