Kommentare
- Kein Duplikat. Die andere Frage betrifft die Anweisung
if
. In dieser Frage wird gefragt, was Klammern ohne eineif
-Anweisung bedeuten.
Antwort
Eckige Klammern sind eine Kurzschreibweise für die Durchführung eines bedingten Tests. Die Klammern [
sowie [[
sind tatsächliche Befehle in Unix, ob Sie es glauben oder nicht.
Denken Sie:
$ [ -f /etc/rc.local ] && echo "real file" real file -and- $ test -f /etc/rc.local && echo "real file" real file
In Bash ist [
ein integrierter Befehl sowie eine ausführbare Datei. [[
ist nur ein Schlüsselwort für Bash.
Beispiel
Sie können dies mit type
:
$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword
Sie können die physische ausführbare Datei hier sehen:
$ ls -l /usr/bin/[ -rwxr-xr-x 1 root root 37000 Nov 3 2010 /usr/bin/[
builtins vs. . Schlüsselwörter
Wenn Sie sich die Bash-Manpage man bash
ansehen, finden Sie die folgenden Definitionen für die 2:
-
Schlüsselwörter – Reservierte Wörter sind Wörter, die für die Shell eine besondere Bedeutung haben. Die folgenden Wörter sind Wird als nicht reserviert als reserviert erkannt und entweder als erstes Wort eines einfachen Befehls (siehe SHELL GRAMMAR unten) oder als drittes Wort eines Falls oder als Befehl:
! case do done elif else esac fi for function if in select then until while { } time [[ ]]
-
builtins – Wenn der Befehlsname keine Schrägstriche enthält, versucht die Shell, ihn zu finden existiert eine Shell-Funktion mit diesem Namen, diese Funktion wird wie oben in F beschrieben aufgerufen UNCTIONS. Wenn der Name nicht mit einer Funktion übereinstimmt, sucht die Shell in der Liste der eingebauten Shell danach. Wenn eine Übereinstimmung gefunden wird, wird dieses integrierte Element aufgerufen.
Wenn der Name weder eine Shell-Funktion noch ein integriertes Element ist und keine Schrägstriche enthält, durchsucht bash jedes Element des PATH nach einem Verzeichnis, das eine ausführbare Datei enthält dieser Name. Bash verwendet eine Hash-Tabelle, um sich die vollständigen Pfadnamen der ausführbaren Dateien zu merken (siehe Hash unter SHELL BUILTIN-BEFEHLE unten). Eine vollständige Suche in den Verzeichnissen in PATH wird nur durchgeführt, wenn der Befehl nicht in der Hash-Tabelle gefunden wird. Wenn die Suche nicht erfolgreich ist, sucht die Shell nach einer definierten Shell-Funktion mit dem Namen command_not_found_handle. Wenn diese Funktion vorhanden ist, wird sie mit dem ursprünglichen Befehl und den Argumenten des ursprünglichen Befehls als Argument aufgerufen, und der Exit-Status der Funktion wird zum Exit-Status der Shell. Wenn diese Funktion nicht definiert ist, gibt die Shell eine Fehlermeldung aus und gibt den Beendigungsstatus 127 zurück.
Manpage
Wenn Sie die Auf der Bash-Manpage finden Sie die Details.
test expr [ expr ] Return a status of 0 or 1 depending on the evaluation of the conditional expression expr. Each operator and operand must be a separate argument. Expressions are composed of the primaries described above under CONDITIONAL EXPRESSIONS. test does not accept any options, nor does it accept and ignore an argument of -- as signifying the end of options.
Zuletzt auf der Manpage:
test and [ evaluate conditional expressions using a set of rules based on the number of arguments.
EDIT # 1
Folgefrage aus dem OP.
Ok, warum gibt es also eine Ich meine, warum „wenn“ überhaupt existiert, wenn „[“ ausreichen würde.
Die if
ist Teil einer Bedingung. Der Befehl test
oder [ ... ]
wertet die Bedingung einfach aus und gibt eine 0 oder zurück a 1. Die 0 oder 1 wird dann von der if-Anweisung bearbeitet. Die 2 arbeiten zusammen, wenn Sie sie verwenden.
Beispiel
if [ ... ]; then ... do this ... else ... do that ... fi
Kommentare
- Ok, warum ist ein " erforderlich, wenn " dann? ich ich und warum ", wenn " überhaupt existiert, wenn " [" würde ausreichen.
- Kleiner Trottel:
[[
kann auch eine eingebaute Shell sein. - @supertonsky – sie funktionieren Sie geben jedoch nur den Status des Tests zurück und können ' auf keine Weise darauf reagieren. Die
if
verhält sich wie ein Schalter und führt die Befehle im Blockthen
aus oder nicht, abhängig von den von der Bedingung zurückgegebenen Ergebnissen.if
ist nicht ' nicht wirklich optional in der Art, wie Sie ' denken, die Beispiele, die wir zeigte die Verwendung von&&
, was derif
ähnelt. Wenn die Bedingung fehlschlägt, wird der Befehl nach&&
nicht ' ausgeführt. - @SteveKoch – as I. Verstehen Sie, die
]
ist in diesem Zusammenhang ein Argument für den Befehl[
.Ich ' würde vermuten, dass es solche gibt, aber ich kann ' an nichts auf meinem Kopf denken. Es könnte sich lohnen, es als weiteres Q zu veröffentlichen, wenn Sie ' wirklich neugierig sind. - @SteveKoch – übrigens
/usr/bin/[
zeigt sich als Teil der Coreutils auf meinem Fedora-System. Sie können jederzeit die Quelle zu diesen Themen konsultieren, wenn Sie genau wissen möchten, wie solche Dinge funktionieren. git.savannah.gnu.org/cgit/coreutils.git
Antwort
Ooohh, eines meiner Lieblingsthemen !!
Eckige Klammern sind ein Synonym für den Befehl „test“. Wenn Sie die Test-Manpage lesen, werden Sie sehen, dass Sie den Testbefehl entweder als
test -r /etc/profile.d/java.sh
oder
Die Leerzeichen zwischen den Klammern und dem Material innerhalb und außerhalb sind erforderlich.
Der Befehl“ test „prüft in diesem Fall, ob die Datei / etc / profile.d / java.sh ist für den aktuellen Benutzer lesbar. Dies impliziert natürlich eine Überprüfung, ob es vorhanden ist .:-)
Die &&
ist eine Bash-Syntaxverknüpfung für „Wenn der Befehl links erfolgreich ist, führen Sie den Befehl rechts aus. Dieser zusammengesetzte Befehl ist also eine Abkürzung für ein „Wenn-Dann“, das folgendermaßen aussehen würde:
if test -r /etc/profile.d/java.sh then /etc/profile.d/java.sh fi
Nun finden Sie auch doppelte eckige Klammern Dies ist eine bash-interne Version einer erweiterten Testfunktion. Beachten Sie, dass diese nicht genau gleich sind. Es gibt Dinge, die Sie mit denen tun können, die Sie mit dem Befehl „test“ und seinen “ [„synonym.
Kommentare
- Ich möchte nur sicherstellen, dass ich es verstehe. Wenn eckige Klammern ein Alias für " test ", sollte ' nicht Ihr zweites Beispiel sein " [- r /etc/profile.d/java.sh] "? Mit anderen Worten, entfernen Sie die redundante Testanweisung.
- Ja, pmont, Sie ' ist natürlich genau richtig! Ich war ' beim Ausschneiden und Einfügen nicht vorsichtig. I ' habe es behoben. Danke!