ren22 hat geschrieben:
warum muss man die Abfrage mit "grep" in eine Subshell packen
Was du eigentlich willst ist:
Code: Alles auswählen
if echo "$testvariable" | grep -q "foo" ; then
echo "foooo"
fi
Du brauchst naemlich kein test(1). Test(1) ist auch nichts anderes als ein Befehl, der ausgefuehrt wird und dessen Exitcode bestimmt, ob das if greift. In dem Fall ist dein Befehl aber:
Die Funktion von test(1) ist hier nicht noetig.
Man muss sich bewusst machen, dass die eckigen Klammern nichts als Syntactic Sugar sind, keinesfalls aber if-Syntax. Man kann also sehr wohl if ohne test(1) verwenden!
und kann den Code nicht so ausführen wie in der 2ten IF Abfrage des Codebeispiels ohne
das es eine Fehlermeldung gibt:
line 8: [: missing `]'
grep: ]: No such file or directory?
Das liegt daran, dass die eckigen Klammern eben keine Shell-Syntax sind sondern ein Befehlsname und dessen abschliessendes Argument.
Hier eine Erlaeuterung im Detail:
- Das if testet ob der folgende Befehl (genauer: die folgende Pipeline) also alles bis zum Strichpunkt einen Exitcode von 0 hat, dann wird der Block ausgefuehrt.
- Die Pipeline besteht aus zwei Befehlen:
1) Dem `['-Befehl mit zwei Argumenten (``echo'' und ``"$testvariable"'')
2) Dem `grep'-Befehl mit zwei Argumenten (``"foo"'' und ``]'')
- Der `['-Befehl, der ein Synonym fuer den `test'-Befehl ist, erfordert, dass sein letztes Argument ``]'' ist, falls man ihn als `[' aufruft. (Siehe Manpage.)
Das ist der Grund weshalb du die erste Meldung bekommst.
- Die zweite Meldung kommt von grep(1), das das Argument ``]'' als Dateinamen interpraetiert.
Nicht so verbreitet und in der Syntax auch etwas sperriger, aber eigentlich shellartiger (weil hier keine separaten Befehle noetig sind, wie mit if) ist die Verwendung von case: