2010-04-14 12 views
13

Worin besteht im Bash-Skript der Unterschied zwischen den folgenden Snippets?Bash-Skript if-Anweisungen

1) Verwenden von einzelnen Klammern:

if [ "$1" = VALUE ] ; then 
# code 
fi 

2) Unter Verwendung doppelte Klammern:

if [[ "$1" = VALUE ]] ; then 
# code 
fi 
+0

[Ähnliche Frage] (http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces) –

Antwort

8

Das [[]] Konstrukt ist die vielseitigere Bash Version von []. Dies ist der erweiterte Testbefehl, der von ksh88 übernommen wurde.

Mithilfe des Testkonstrukts [[...]] können viele Logikfehler in Skripten verhindert werden. Zum Beispiel funktionieren die Operatoren & &, ||, < und> innerhalb eines [[]] Tests, obwohl ein Fehler in einem [] Konstrukt auftritt.

More info on the Advanced Bash Scripting Guide.

In Ihren Snippets gibt es keinen Unterschied, da Sie keine der zusätzlichen Funktionen verwenden.

1

Die Verwendung von [[ unterdrückt die normale Wortsplitting- und Pfadnamenerweiterung für den Ausdruck in den Klammern. Es ermöglicht auch eine Reihe von Additionsoperationen, wie Mustererkennung

2

[ ist ein Bash Builtin, [[ ist ein Schlüsselwort. Siehe die bash FAQ. Vorsicht: Die meisten Bash-Skripte im Internet sind Mist (arbeiten Sie nicht mit Dateinamen mit Leerzeichen, führen Sie versteckte Sicherheitslöcher ein, etc.), und bash ist viel schwieriger zu meistern, als man vielleicht denkt. Wenn Sie Bash-Programmierung machen wollen, sollten Sie mindestens die bash guide und die bash pitfalls studieren.

0

Für den Fall, Portabilität ist erforderlich:

Für Portabilität Testen Sie die Bourne über das Erbstück Projekt Shell bekommen können oder:

http://freshmeat.net/projects/bournesh

(Unter Mac OS X zum Beispiel/bin/sh ist keine reine Bourne-Shell.)

0

das ist auch ein externes Programm, was nicht bedeutet, dass es nicht eingebaut ist.

which [ 
/usr/bin/[ 

In einzelnen eckigen Klammern Sie -lt für ‚kleiner als‘ alias < während sonst zu verwenden, haben Sie <

if [ 3 -lt 4 ] ; then echo yes ; fi 
yes 
if [ 3 < 4 ] ; then echo yes ; fi 
bash: 4: No such file or directory 
if [[ 3 < 4 ]] ; then echo yes ; fi 
yes 
if [[ 3 -lt 4 ]] ; then echo yes ; fi 
yes 

4 verwenden könnte: Datei Mittel, versucht er, von einem lesen Datei namens "4" - Umleitung stdin < Das gleiche für> und stdout.