Ich habe gelesen, dass Semikolon zum Trennen von Programmen verwendet wird:
$ echo 3; ls -la
Bedeutet das if
, then
und handelt else
es sich hier um separate Programme?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
Bei dieser Frage handelt es sich nicht um Semikolons.
bash
shell-script
shell
Maxim Koretskyi
quelle
quelle
[ $variable == abcdef ] && echo yes || echo no
Antworten:
Die
;
getrennten Aussagen (lose gesprochen). Es ist (fast) immer möglich, eine;
durch eine neue Zeile zu ersetzen .Zu sagen, dass
;
zwei Programme voneinander getrennt sindif
undthen
"Programme" sein müssen, ist etwas zu einfach, da eine Aussage über reservierte Wörter, Shell - Funktionen, eingebaute Dienstprogramme und externe Dienstprogramme sowie Kombinationen davon unter Verwendung von Pipes und booleschen Operatoren usw. Getroffen werden kann . etc.Beide
if
undthen
sind reservierte Wörter in der Shell-Grammatik , keine "Programme". Hier werden sie verwendet, um das aufzubauen, was technisch ein zusammengesetzter Befehl genannt wird .echo
ist wahrscheinlich ein in die Shell eingebautes Dienstprogramm (muss es aber nicht sein) undls
ist wahrscheinlich ein externes Dienstprogramm (oder "Programm", wie Sie sagen).quelle
Während dies eine faire erste Annäherung ist, wenn man anfängt, die Grundlagen der Verwendung von Shells zu erlernen, wird auf der Ebene von "hier wird ein Programm ausgeführt" und "hier werden mehrere Programme nacheinander in einer einzigen Zeile ausgeführt" ist es eigentlich nicht wahr.
Für Anfänger ist es schwieriger zu verstehen, aber die richtige Erklärung ist, dass die Shell-Sprache eine Computersprache ist . Es hat eine Syntax . Diese Syntax umfasst verschiedene lexikalische Elemente, darunter (unter anderem) Zeilenumbrüche, Operatoren, Wörter und reservierte Wörter.
if
,then
,else
, Undfi
sind alle reservierten Wörter . Sie haben besondere Bedeutungen beim Parsen der Eingabe, die man einer Shell gemäß ihrer Grammatik gibt . In ähnlicher Weise;
ist ein Separator Operator .Die Eingabe in der Shell-Sprache wird somit als Ganzes als Computerprogramm verstanden, das von einem anderen Programm, einem Interpreter , der Shell interpretiert wird. Die einzelnen grammatikalischen Teile sind keine Programme. Mit der Shell-Sprache können Sie (andere) Programme angeben, die von der Shell ausgeführt werden sollen.
[
ist kein spezielles lexikalisches Element in der Shell-Grammatik wie ein Operator. Es ist ein gewöhnliches Wort , das ein solches Programm benennt[
. Viele Shells haben eine integrierte Version dieses Programms, die im Code des Shell-Programms selbst kombiniert ist. Sie können jedoch auch ein externes Programm mit diesem Namen finden, z. B./bin/[
oder/usr/bin/[
, das von anderen Programmen als Shells aufgerufen werden kann. Ebenso]
ist es auch kein spezielles Shell-Lexikonelement. Es ist ein gewöhnliches Wort, das zum Argument für das[
Programm wird. Das[
Programm verlangt, dass sein letztes Argument, wenn es ausgeführt wird, sein muss]
, das es dann ignoriert.Ein anderes ähnliches Programm, das in Ihrer Frage genannt wird, ist
echo
. Wieder haben die meisten Shells eine eingebaute Version dieses Programms. Es gibt aber auch eine externe Version des Programms, die irgendwo wie/bin/echo
oder/usr/bin/echo
für andere Programme als Shells aufgerufen werden kann.Ein drittes in Ihrer Frage genanntes Programm ist
ls
. Shells haben im Allgemeinen keine integrierten Versionen dieses Programms, und es ist ein externes Programm, das sich irgendwo wie/bin/ls
oder befindet/usr/bin/ls
.Weitere Informationen zur Bourne Again-Shell finden Sie in den grundlegenden Shell-Funktionen der GNU Bourne Again-Shell-Info-Dokumentation. Andere Muscheln haben natürlich andere Grammatiken. Die Single Unix Specification beschreibt eine Syntax, an die sich alle POSIX-konformen Shells (in ihren POSIX-konformen Modi) halten sollen.
Weitere Lektüre
test
. Dienstprogramme . Basisspezifikationen Problem 7. Die offene Gruppe. IEEE 1003.1-2008. ISBN 1937218812.quelle
Es ist eigentlich nicht weit hergeholt
if
,then
undelse
als externe Programme zu denken . Tatsächlich wurde die Thompson-Shell in der ursprünglichen 1. Edition von Unix implementiertif
undgoto
als externe Programme. Dies ist möglich, weil der Unterprozess Dateideskriptoren mit dem Shell-Prozess gemeinsam nutzt, sodass ein (Weiter-) Goto nur die Eingabe lesen musste, bis er die Zielbezeichnung findet und dann beendet wird. Siehe Thompson-Shell .quelle
if
undifelse
, die Teile von sindexecline
. Dies kommt jedoch nichtif
in Frage.Das
then
undelse
sind keine Programme. Die anderen Teile sind. Beachten Sie, dass es kein;
'direkt nach ihnen gibt, aber nach dem Befehl, dem sie vorangehen.Das
[ ... ]
ist ein Befehl und benötigt das;
if gefolgt vom Beginn eines anderen Befehls.AFAIK, alle Kontrollstrukturen in Bash und wahrscheinlich die meisten * nix-Shells, sind gleich. Sie sind Anweisungen an den Dolmetscher. Der Test oder die Bedingung verwendet andererseits ein Programm / einen Prozess, der "ausgeführt" wird und Befehle sind. Da
then
es sich um einen Teil der Zeile handelt, die zumecho
Befehl führt, muss dieser durch eine neue Zeile vom vorherigen Befehl getrennt werden[ ... ]
. Es muss nicht von dem Befehl getrennt werden, den es steuertecho yes
.Rechtlich, obwohl hässlich und schwer zu lesen, könnten Sie dies auch tun.
Beachten Sie, dass
;
zwischen den Steuerelementen hier überhaupt keine Notwendigkeit besteht , obwohl sie sich nicht in einer eigenen Leitung befinden.Interessanterweise ist die gesamte Kontrollstruktur (
if ... fi
) ein Shell-Befehl, und das Ganze muss mit einem Zeilenumbruch oder einem Zeilenumbruch enden;
. Die letzte Zeile kann nicht seinfi echo done
, muss aber seinfi; echo done
. Das Gleiche wie eine ZuweisungVARIABLE='abcdef'
ist ein Befehl.Obwohl die gesamten Kontrollstrukturen Befehle sind, sind sie immer noch keine Programme.
quelle
if
,elif
,then
, Undfi
verwendet , werden alle reservierten Schlüsselwörter einer der Konstrukte als Verbindung Befehl in der Schale bezeichnet umzusetzen, was bedeutet , es nicht ein Befehl sein kann (oder besser gesagt, ein anderer Befehl) in der Schale von jedem dieser Namen. Der Zweck der;
im Allgemeinen nicht Befehle zu trennen, aber einen Befehl zu beenden Liste . Das Folgende ist zum Beispiel eine gültigeif
Aussage:Die Bedingung der
if
Anweisung ist die Befehlslisteecho foo; echo bar; echo baz
. Der Parser weiß, dass die Bedingung beendet ist, dathen
das unmittelbar auf ein Semikolon folgende Kommando kein Befehl sein kann, da es sich um ein reserviertes Schlüsselwort handelt. Somit weiß es, was folgtthen
der Beginn des Körpers ist. Ebensofi
ist es ein reserviertes Schlüsselwort und kann daher kein dritter Befehl im Hauptteil derif
Anweisung sein, sondern markiert das Ende des zusammengesetzten Befehls.quelle
if program1 foo; program2 bar; program3 baz;
, welcher Programmstatus sollte sein0
, damit die Shell fortfährtthen
? Der Letzte?program3 baz
. Der Beendigungsstatus einer Befehlsliste ist der Beendigungsstatus des letzten Befehls in dieser Liste. Die anderen beiden können fehlschlagen, ohne die Bedingung zu beeinflussen.