Przeczytałem, że średnik służy do oddzielania programów:
$ echo 3; ls -la
Czy to znaczy if
, then
i czy else
są tu osobne programy?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
To pytanie nie dotyczy średników.
bash
shell-script
shell
Maxim Koretskyi
źródło
źródło
[ $variable == abcdef ] && echo yes || echo no
Odpowiedzi:
Te
;
wypowiedzi oddziela (luźno mówienia). Jest (prawie) zawsze możliwe zastąpienie;
znaku nowej linii.Powiedzieć, że
;
oddziela dwa programy, a zatemif
ithen
musi być „programy” jest trochę zbyt uproszczone jako oświadczenie może być wykonana ze słów zastrzeżonych, funkcji powłoki, wbudowany mediów i narzędzi zewnętrznych, oraz kombinacje tych rur używania i operatorów logicznych etc. . itp.Zarówno
if
ithen
są zarezerwowane słowa gramatyki muszli , a nie „programy”. Tutaj służą do budowania tego, co technicznie nazywa się złożonym poleceniem .echo
jest prawdopodobnie wbudowanym narzędziem w powłoce (ale nie musi tak być) ils
prawdopodobnie jest narzędziem zewnętrznym (lub „programem”, jak mówisz).źródło
Chociaż jest to uczciwe pierwsze przybliżenie, kiedy zaczynasz uczyć się samych podstaw korzystania z powłok, na poziomie „tutaj jest sposób uruchamiania programu” i „tutaj jest to, jak uruchamia się wiele programów jeden po drugim w jednym wierszu” , to nie jest tak naprawdę prawda.
Trudniejsze do zrozumienia dla początkującego, ale bardziej poprawne jest to, że językiem powłoki jest język komputerowy . Ma składnię . Ta składnia obejmuje różne elementy leksykalne, w tym (między innymi) znaki nowej linii, operatory, słowa i słowa zastrzeżone.
if
,then
,else
, Ifi
są zarezerwowane słowa . Mają one szczególne znaczenie podczas analizowania danych wejściowych przekazywanych powłoce, zgodnie z jej gramatyką . Podobnie;
jest operatorem separatora .Dane wejściowe w języku powłoki są zatem, jako całość, programem komputerowym interpretowanym przez inny program, tłumacza , powłokę. Poszczególne części gramatyczne nie są programami. Język powłoki to sposób określania (innych) programów do uruchomienia powłoki.
[
nie jest specjalnym elementem leksykalnym w gramatyce powłoki, takim jak operator. Jest to zwykłe słowo , które nazywa jeden taki program o nazwie[
. Wiele powłok ma wbudowaną wersję tego programu, połączoną z kodem samego programu powłoki, ale można także znaleźć program zewnętrzny o tej nazwie, np./bin/[
Lub/usr/bin/[
, który programy inne niż powłoki mogą wywoływać. Podobnie,]
nie jest też specjalnym elementem leksykalnym powłoki. To zwykłe słowo, które staje się argumentem dla[
programu.[
Program wymaga, że jej ostatni argument, gdy jest ona wykonywana, bądź]
, który następnie przechodzi do zignorowania.Innym podobnym programem wymienionym w twoim pytaniu jest
echo
. Ponownie, większość powłok ma wbudowaną wersję tego programu. Ale znowu jest też zewnętrzna wersja programu, taka jak/bin/echo
lub/usr/bin/echo
, do wywoływania programów innych niż powłoki.Trzeci program wymieniony w twoim pytaniu to
ls
. Powłoki na ogół nie mają wbudowanych wersji tego programu i jest to program zewnętrzny, który można znaleźć gdzieś np./bin/ls
Lub/usr/bin/ls
.Więcej informacji na temat powłoki Bourne Again można znaleźć w Podstawowych funkcjach powłoki dokumentacji GNU Bourne Again. Inne skorupy mają naturalnie inną gramatykę. Specyfikacja Single Unix opisuje składnię, do której powinny stosować się wszystkie powłoki zgodne z POSIX (w ich trybach zgodnych z POSIX).
Dalsza lektura
test
. Użytkowe . Podstawowe specyfikacje Wydanie 7. Grupa otwarta. IEEE 1003.1-2008. ISBN 1937218812.źródło
To nie jest rzeczywiście daleko idące myśleć
if
,then
ielse
jak programami zewnętrznymi. W rzeczywistości, Thompson shell w oryginalnym 1. edycji Unix wdrożoneif
igoto
jak programami zewnętrznymi. Jest to możliwe, ponieważ podproces współdzieli deskryptory plików z procesem powłoki, więc goto (do przodu) musiało po prostu czytać dane wejściowe, dopóki nie znajdzie etykiety docelowej, a następnie kończy działanie. Zobacz powłokę Thompson .źródło
if
iifelse
, które są częściąexecline
.if
Jednak nie o to chodzi.then
Ielse
nie są programy. Pozostałe części są. Zauważ, że nie ma;
„bezpośrednio po nich”, ale po poleceniu, które poprzedzają.[ ... ]
Jest polecenie, a potrzebuje;
jeśli następuje początek innego polecenia.AFAIK, wszystkie struktury kontrolne w Bash i prawdopodobnie większość powłok * nix, są takie same. Są to instrukcje dla tłumacza. Z drugiej strony test lub warunek wykorzystuje program / proces, który jest „wykonywany” i jest komendą. Ponieważ
then
jest częścią wiersza prowadzącego doecho
polecenia, musi być oddzielony nowym wierszem od poprzedniego polecenia[ ... ]
. Nie trzeba go oddzielać od sterowanego polecenia, czyliecho yes
.Z prawnego punktu widzenia, choć brzydkie i trudne do odczytania, możesz to zrobić.
Zauważ, że nie ma tutaj potrzeby
;
pomiędzy kontrolkami, nawet jeśli nie są na swojej linii.Co ciekawe, cała struktura kontrolna (
if ... fi
) jest poleceniem powłoki, a całość musi kończyć się nową linią lub znakiem a;
. Ostatnia linia nie może być,fi echo done
ale musi byćfi; echo done
. To samo co przypisanieVARIABLE='abcdef'
jest poleceniem.Mimo że całe struktury sterujące są komendami, nadal nie są programami.
źródło
if
,elif
,then
, Ifi
są wszystkie słowa zarezerwowane stosowane do realizacji jednego z konstruktami, o których mowa, jak polecenie związku w powłoce, co oznacza, że nie może być poleceniem (lub raczej inne polecenie) według któregokolwiek z tych nazw w powłoce. Ogólnie rzecz biorąc, celem;
nie jest rozdzielanie poleceń, ale zakończenie listy poleceń . Na przykład następująca poprawnaif
instrukcja:Warunkiem
if
instrukcji jest lista poleceńecho foo; echo bar; echo baz
. Analizator składni wie, że warunek się skończył, ponieważthen
bezpośrednio po średniku nie może być poleceniem, ponieważ jest zastrzeżonym słowem kluczowym. W ten sposób wie, że tym, co następuje,then
jest początek ciała. Podobniefi
jest zastrzeżonym słowem kluczowym i dlatego nie może być trzecim poleceniem w treściif
instrukcji, ale oznacza koniec polecenia złożonego.źródło
if program1 foo; program2 bar; program3 baz;
, jaki powinien być status programu0
, aby powłoka przechodziła dalejthen
? Ostatni?program3 baz
. Status wyjścia z listy poleceń jest statusem wyjścia z ostatniego polecenia na tej liście. Pozostałe dwa mogą zawieść bez wpływu na stan.