Ś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.

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.


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.


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 .


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.


-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.