2013-09-29 6 views
13

Gibt es eine Liste aller if Switches für die Verwendung in Bash-Scripting? Manchmal sehe ich jemanden, der es benutzt, und ich frage mich, was der Schalter, den sie benutzen, tatsächlich tut.Liste von 'if' wechselt irgendwo?

Beispiel ist die -z in diesem. Ich weiß, wie man es benutzt, aber ich weiß nicht, woher es stammt.

if [ -z "$BASH_VERSION" ]; then 
    echo -e "Error: this script requires the BASH shell!" 
    exit 1 
fi 

Alle Referenzen, Leitfäden, Beiträge, Antworten würden geschätzt.

+0

http://www.gnu.org/software/bash/manual/bashref.html –

+0

'[' ist ein Kurzname für den Befehl 'test'. Probiere 'Man Test' aus. – Barmar

+0

@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

Antwort

18

Sehen Sie sich die Bash-Manpage an (man bash). Die Optionen werden in der CONDITIONAL EXPRESSIONS Abschnitt angegeben:

CONDITIONAL EXPRESSIONS 
     Conditional expressions are used by the [[ compound command and the 
     test and [ builtin commands to test file attributes and perform string 
     and arithmetic comparisons. Expressions are formed from the following 
     unary or binary primaries. If any file argument to one of the pri- 
     maries is of the form /dev/fd/n, then file descriptor n is checked. If 
     the file argument to one of the primaries is one of /dev/stdin, 
     /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, 
     is checked. 

     Unless otherwise specified, primaries that operate on files follow sym- 
     bolic links and operate on the target of the link, rather than the link 
     itself. 

     -a file 
       True if file exists. 
     ... more options ... 

Es ist auch in der Hilfe erklärt:

$ help [ [: [ arg... ] 
    This is a synonym for the "test" builtin, but the last 
    argument must be a literal `]', to match the opening `['. 
+6

Online-Handbuch: [Bash Bedingte Ausdrücke] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

2

Es ist eigentlich nicht if das ist die Bereitstellung dieser - es ist , besser bekannt unter dem Namen test. help test sollte Ihnen eine Liste aller Optionen geben, die es nehmen kann. Sie können auch the standard betrachten, wenn Sie sich interessieren.

+1

-1: test ist sowohl ein Befehl '/ bin/test' als auch ein Bash-Built-in. 'man test' gibt Ihnen das Dokument für den Befehl, aber' ['ist ein Synonym für das eingebaute. Als Beispiel für divergentes Verhalten unter OSX unterstützt der Bash-Installer den '-N'-Test, aber der'/bin/Test' nicht – SheetJS

3

Sie sind keine Schalter für die if Anweisung, aber für den test Befehl ([ ist ein Synonym für den test builtin). Eine vollständige Liste finden Sie unter help test in bash.

4

Ja. Diese wird als conditional expressions und diese werden verwendet, um die [[compound command und die test und [builtin commands ([ ist einfach ein Synonym für test).

Lesen Sie den Abschnitt 6.4 Bash Conditional Expressions des Bash Reference Manual, der eine Liste aller dieser Schalter und ihrer Verwendung enthält.

+0

Einzelseite: [6.4 Bash Conditional Expressions] (http://www.gnu.org/ software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

2

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.

+0

'[' ist kein Alias ​​von Test. Synonym ist das Wort, das die Manpage verwendet. Alias ​​hat eine spezifische Bedeutung (in der Bash-Manpage, lesen Sie den Abschnitt 'ALIASES') – SheetJS

+0

Okay. Ich werde das ändern. Ich suchte einfach nach einem Wort, das erklären würde, wie die beiden miteinander verbunden sind. –