Normalerweise verwende ich eckige Klammern in der if-Anweisung:
if [ "$name" = 'Bob' ]; then ...
Wenn ich jedoch überprüfe, ob dies grep
erfolgreich war, verwende ich keine eckigen Klammern:
if grep -q "$text" $file ; then ...
Wann sind die eckigen Klammern in der if
Anweisung erforderlich ?
bash
if-statement
square-bracket
Mischa Moroshko
quelle
quelle
help '['
Antworten:
Die eckigen Klammern sind ein Synonym für den
test
Befehl. Eineif
Anweisung überprüft den Exit-Status eines Befehls, um zu entscheiden, welcher Zweig verwendet werden soll.grep -q "$text"
ist ein Befehl, aber"$name" = 'Bob'
nicht - es ist nur ein Ausdruck.test
ist ein Befehl, der einen Ausdruck nimmt und auswertet:if test "$name" = 'Bob'; then ...
Da eckige Klammern ein Synonym für den
test
Befehl sind, können Sie ihn als Ihre ursprüngliche Anweisung umschreiben:if [ "$name" = 'Bob' ]; then ...
quelle
if $boolean_var ; then ...
keine Klammern benötigt?$boolean_var
den Wert "true" oder "false" hat, funktioniert es, weil Sie den Befehltrue
oder ausführenfalse
.if $boolean_var ; then ...
funktioniert nicht, wenn $ boolean_var0
oder ist1
, sieheman true
undman false
.0
und1
Befehle in$PATH
- aber das wäre hässlich.[
ist eigentlich ein Befehl, der dem Befehl entspricht (fast siehe unten)test
. Es ist nicht Teil der Shell-Syntax. (Beide[
undtest
, abhängig von der Shell, sind häufig auch integrierte Befehle, aber das hat keinen Einfluss auf ihr Verhalten, außer vielleicht auf die Leistung.)Eine
if
Anweisung führt einen Befehl aus und führt dasthen
Teil aus, wenn der Befehl erfolgreich ist, oder daselse
Teil (falls vorhanden), wenn es fehlschlägt. (Ein Befehl ist erfolgreich, wenn er mit einem Status ($?
) von 0 beendet wird. Er schlägt fehl, wenn er mit einem Status ungleich Null beendet wird.)Im
if [ "$name" = 'Bob' ]; then ...
Der Befehl lautet
[ "$name" = 'Bob' ]
(Sie können denselben Befehl direkt ausführen, ohne das
if
.)Im
if grep -q "$text" $file ; then ...
Der Befehl lautet
grep -q "$text" $file
man [
oderman test
für weitere Informationen.Fußnote: Nun, der
[
Befehl entspricht fast demtest
Befehl. Der Unterschied besteht darin,[
dass dies]
als letztes Argument erforderlich ist undtest
nicht - und tatsächlich nicht zulässt (genauer gesagt,test
behandelt ein]
Argument nicht speziell; es könnte beispielsweise ein gültiger Dateiname sein). (Es dauerte nicht haben , um auf diese Weise umgesetzt werden, aber eine[
ohne passende]
würde eine Menge Leute sehr , sehr nervös gemacht haben.)quelle
nervous
Argument.Der beste Weg, um an die
[ ... ]
Syntax zu denken , ist[
, sich als Programm zu betrachten - was es ist!Überprüfen Sie dies heraus:
Auf der anderen Seite verwenden Sie diese Version wahrscheinlich nicht, da sie
bash
auch[
als integrierte Shell bereitgestellt wird.if
Um Ihre Frage zu beantworten: Führen Sie den Befehl aus, den Sie ihm geben, und sehen Sie, ob der Rückgabewert ist0
oder nicht. Sie verwenden[
andere, interessantere Vergleiche, z. B. Zeichenfolgenvergleiche. Sieheman [
undman bash
.quelle
[
es intern implementiert ist. Ich denke, das ist es, wofür es[[
ist.[
es ein eingebautes ist. Deshalbbuiltin [
funktioniert.[[
ist etwas anders als[
es macht verschiedene Dinge.bash
Manpage nach.test expr
und[ expr ]
sind zusammen aufgeführt.type -a [