Die einzelnen eckigen Klammern ([ ... ]
) ist ein Synonym des test
Befehl. Wenn Sie auf die manpage for test schauen, werden Sie fast alle (BASH könnte ein paar extra nicht hier erwähnt haben) der verschiedenen wenn Schalter, wie Sie sie genannt haben. Alles in einem leicht zu finden.
Wenn Sie doppelte eckige Klammern ([[ ... ]]
) verwenden, verwenden Sie einen erweiterten BASH-Testsatz. Diese haben hauptsächlich mit regulärem Expressions-Matching und Glob-Matching zu tun (und erweiterten Glob-Matching, wenn Sie das auch haben). Dazu müssen Sie diese BASH-Manpage lesen.
Sie nannte sie wenn Schalter, aber das ist nicht wirklich richtig. Diese sind Tests und haben wirklich nichts mit dem if
Befehl zu tun.
Der if
Befehl führt lediglich den Befehl geben Sie es, und dann, wenn dieser Befehl einen Exit-Code von 0
zurückkehrt, wird die if
Teil der if
Anweisung ausführen. Andernfalls wird der else
-Teil ausgeführt (falls vorhanden).
Schauen wir uns diese:
$ rm foo.test.txt # Hope this wasn't an important file
$ if ls foo.test.txt
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
ls: foo.test.txt: No such file or directory
I can't find it anywhere..
Die if
Anweisung startet den ls foo.test.txt
Befehl und der ls
Befehl gibt eine nicht-Null, da die Datei nicht existiert. Dies führt dazu, dass die if
-Anweisung die else
-Klausel ausführt.
Lasst uns das noch einmal versuchen ...
$ touch foo.test.txt # Now this file exists.
$ if ls foo.test.txt # Same "if/else" statement as above
> then
> echo "This file exists"
> else
> echo "I can't find it anywhere.."
> fi
foo.test.txt
This file exists
Hier wird der ls
Befehl ein 0
Exit-Status zurück (da die Datei vorhanden ist und die Datei vorhanden ist und kann durch den ls
Befehl stat'ed werden.
Normalerweise sollten Sie den ls
Befehl nicht verwenden, um eine Datei zu testen. ich kann es nur hier, um zu zeigen, dass die if
Anweisung den Befehl ausführt, ausgeführt dann die if
oder else
Klausel in Abhängigkeit von dem Exit-Status des Befehls. Wenn Sie testen möchten, ob eine Datei vorhanden ist, sollten Sie den Befehl test -e
statt ls
Befehl verwenden:
if test -e foo.test.txt # Same as above, but using "test" instead of "ls"
then
echo "This file exists"
else
echo "I can't find it anywhere.."
fi
Wenn die Datei existiert, test -e
wird ein Exit-Status von 0
zurückzukehren. Andernfalls wird ein Nicht-Null-Beendigungsstatus zurückgegeben.
Wenn Sie dies tun:
$ ls -i /bin/test /bin/[
10958 /bin/[ 10958 /bin/test
Das 10958
die Inode ist. Dateien mit demselben Inode sind zwei verschiedene Namen für die gleiche Datei. Somit sind [
und test
Befehl weich verknüpft . Das heißt, Sie [
statt test
verwenden:
if [ -e foo.test.txt ]
then
echo "This file exists"
else
echo "I can't find it anywhere.."
fi
kommt mir bekannt vor?
1. In BASH werden die test
und [
gebautet, so dass, wenn Sie diese Befehle in BASH laufen, ist es nicht /bin/test
oder /bin/[
läuft. Sie sind jedoch immer noch miteinander verbunden miteinander.
http://www.gnu.org/software/bash/manual/bashref.html –
'[' ist ein Kurzname für den Befehl 'test'. Probiere 'Man Test' aus. – Barmar
@Barmar du meinst 'hilfe test'. 'man test' ist die Dokumentation für'/bin/test', und es unterstützt verschiedene Optionen aus dem 'test' builted – SheetJS