awk
zur Rettung.
$ scselect | awk '' (Automatic)
Wenn Sie möchten, können Sie auch sed
die Parens entfernen.
$ scselect | awk '' | sed 's/[()]//g' Automatic
Ich muss den aktuellen Netzwerkstandort innerhalb eines Bash-Skripts verwenden. Ich habe es mit dem scselect
Befehl versucht, der ein Sternchen neben dem aktuellen Ort ausgibt:
~/ scselect Defined sets include: (* == current set) 70209F72-5BE9-44D1-979E-A8BA25A317B4 (Office) * BDF51A74-6547-4747-BD21-30C51DA26CB1 (Automatic)
Das funktioniert nicht:
#!/bin/bash if [ `scselect | grep "*.*Automatic"` ]; then ... fi
aufgrund der *
in der Ausgabe scselect
davon erweitert sich die Dateinamenliste im aktuellen Verzeichnis.
awk
zur Rettung.
$ scselect | awk '' (Automatic)
Wenn Sie möchten, können Sie auch sed
die Parens entfernen.
$ scselect | awk '' | sed 's/[()]//g' Automatic
Sie könnten einfach *
mit einem entkommen \
. Außerdem sieht es so aus scselect
, als würden zumindest bei Snow Leopard die definierten Sätze an stderr statt an stdout ausgegeben. Daher müssen Sie stderr wahrscheinlich zu stdout umleiten:
scselect 2>&1 | grep "\*.*Automatic"
Diese:
if [ `scselect | grep "*.*Automatic"` ]; then
Bedeutet: Führen Sie den Befehl scselect aus und grep für *. * Automatic, was ein ungültiger regulärer Ausdruck ist. Das Sternchen ist ein Modifikator für das vorherige Atom ("Ding") im Ausdruck, daher kann es nicht das erste sein.
Wenn Sie ein tatsächliches Sternchen abgleichen möchten, müssen Sie es mit einem Backslash abschließen.
Spiff schlug dies vor, verwendete jedoch doppelte Anführungszeichen, die den Backslash nicht weitergeben würden, man muss einfache Anführungszeichen oder einen doppelten Backslash verwenden. Verwirrt noch? :)
Das würde also geben:
if [ `scselect | grep '\*.*Automatic'` ]; then
Führen Sie den Befehl scselect aus, suchen Sie die Zeile, die mit *. * Automatic übereinstimmt, und geben Sie sie aus. Verwenden Sie diese dann als Argumente für den Befehl 'test' (auch bekannt als '[').
Der Befehl test verwendet keine Ausgabezeile von scselect als Argument.
Was Sie wirklich tun wollen, ist, den Testbefehl überhaupt nicht zu verwenden:
if scselect | grep '\*.*Automatic'; then
Wie Spiff jedoch erwähnt hat, sendet scselect aus irgendeinem dummen Grund seine Ausgabe an stderr und nicht an stdout.
So endet es jetzt mit:
if scselect 2>&1 | grep '\*.*Automatic'; then
Was großartig funktioniert, aber dennoch die Zeile sendet, die grep uns zu STDOUT gibt, was wir wahrscheinlich in unserer Ausgabe nicht wollen, also korrigieren wir das:
if scselect 2>&1 | grep '\*.*Automatic' >/dev/null 2>&1; then
Und ... los gehts.