Pipe-Ausgabe von grep an eine Variable

Ich muss in der Lage sein, in eine Variable zu schreiben, ob der Test für ein grep entweder WAHR oder FALSCH ist, damit ich ihn später verwenden kann

Für die folgenden, wenn ich laufe

defaults read com.apple.Finder | grep "AppleShowAllFiles"

Auf meinem System würde es zurückkehren

AppleShowAllFiles = FALSE;

Cool. Also möchte ich diese Antwort jetzt an einen Test weiterleiten. Hier bleibe ich hängen.

Ich denke, wenn ich diese Ausgabe einer bestimmten Variablen zuweisen/zuordnen kann, wäre ich in der Lage, einen Test darauf durchzuführen. Sagen Sie jetzt einfach, ich habe den Wert dieser Ausgabe einer Variablen zugewiesen, in diesem Fall werde ich sie $ASAFals meine Variable verwenden, ich kann sie in einem Test wie diesem ausführen

if [ $ASAF = "AppleShowAllFiles = TRUE;" ]; then  
    defaults write com.apple.Finder AppleShowAllFiles FALSE  
    killall Finder  
else  
    defaults write com.apple.Finder AppleShowAllFiles True  
    killall Finder  
fi

Wenn es eine andere Möglichkeit gibt, dies zu tun, wäre ich mehr als offen für Optionen. Ich musste so etwas schon lange nicht mehr machen und bin etwas ratlos. Ich habe Google ein bisschen durchsucht, aber es waren alles Antworten ohne Erklärungen und unter Verwendung des Rückgabewerts von 0oder 1. Ich denke, die zurückgegebene Ausgabe, die einer Variablen zugewiesen wird, wäre angemessener, da ich sie dann bei Bedarf immer wieder im Skript verwenden kann.

Antworten (2)

Sie müssen grepüberhaupt nicht verwenden:

[[ $(defaults read com.apple.finder AppleShowAllFiles) = 0 ]] && bool=true || bool=false
defaults write com.apple.finder AppleShowAllFiles -bool $bool
osascript -e 'quit app "Finder"'

defaults readgibt boolesche Werte als 1oder aus 0. Zum Beispiel Trueoder YESals String wird ebenfalls als boolescher Wert interpretiert, gibt aber -bool truean, dass der Wert tatsächlich boolesch ist.

Das ist genau das, was ich will. Verwenden der TRUEoder- FALSEWerte einer Antwort. Noch besser als greptesten. Danke schön!

Versuchen

if [[ $(defaults read com.apple.Finder | grep "AppleShowAllFiles") == "AppleShowAllFiles = TRUE;" ]]; then
    defaults write com.apple.Finder AppleShowAllFiles FALSE
else
    defaults write com.apple.Finder AppleShowAllFiles True
fi
killall Finder

$(...)führt den Teil dazwischen aus ()und ersetzt ihn durch das Ergebnis. Könntest du also auch machen

ASAF=$(defaults read com.apple.Finder | grep "AppleShowAllFiles")

das Ergebnis zuweisen $ASAF.

PS: Ich habe auch zwei andere Dinge in deinem Skript geändert

  • [[für den Testteil verwenden (hat mehr Funktionalität als [und ist in bash eingebaut
  • zum Vergleichen von Strings verwenden ==( =nur für Zuweisungen)
Ich schaue mir Ihre Bearbeitung meines Beitrags an. Wie haben Sie die Zeilen, die mit beginnen, defaults write.com.appleweiter einrücken lassen als die Zeilen darüber und darunter? Ich habe versucht, das für die Formatierung von Werten zum Laufen zu bringen, und es ist fehlgeschlagen. :-/
>ist zum Zitieren, 4 Leerzeichen sind für Code :-)
Ich habe festgestellt, dass ich die Ausgabe direkt einer Variablen zuweisen kann, wenn ich sie mit aufrufe foofoo=$(defaults read com.apple.foobar | grep "foo"). Ich werde Ihre Methode in Zukunft verwenden. Es wirkt stabiler.
=kann auch für Vergleiche innerhalb [[und [/ testin bash verwendet werden. POSIX definiert =, aber nicht ==(aber POSIX definiert [[auch nicht).