Zapisz wynik potoku do zmiennej

0

Muszę być w stanie napisać, czy test grepa jest PRAWDA, czy FAŁSZ do zmiennej, aby móc go później użyć

Dla następujących, jeśli uruchomię

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

w moim systemie powróci

AppleShowAllFiles = FALSE;

Fajne. Więc teraz chcę przekazać tę odpowiedź do jakiegoś testu. Tu utknąłem.

Myślę, że jeśli mogę potokować / przypisać to wyjście do określonej zmiennej, mógłbym przeprowadzić na nim test. Teraz, powiedzmy, przypisałem wartość tego wyjścia do zmiennej, w tym przypadku użyję $ASAFjako mojej zmiennej, mogę uruchomić ją w teście takim jak ten

jeśli [$ ASAF = "AppleShowAllFiles = TRUE;" ]; następnie
domyślnie napisz com.apple.Finder AppleShowAllFiles FALSE
killall Finder
inne
domyślnie napisz com.apple.Finder AppleShowAllFiles True
killall Finder
fi

Jeśli jest na to inny sposób, byłbym bardziej niż otwarty na opcje. Przez jakiś czas nie musiałem robić czegoś takiego i jestem trochę zakłopotany. Google trochę mi się wydawało, ale wszystkie odpowiedzi były bez wyjaśnień i przy użyciu wartości zwracanej z 0lub 1. Myślę, że zwrócone dane wyjściowe przypisane do zmiennej byłyby bardziej odpowiednie, ponieważ w razie potrzeby mogę ich używać w skrypcie.

Danijel-James W.
źródło

Odpowiedzi:

1

Jeśli chcesz tylko zapisać kod powrotu (powodzenie / niepowodzenie) polecenia, użyj $?:

# grep -q to avoid sending output to `stdout` and to stop if it finds the target.
defaults read com.apple.Finder | grep -q "AppleShowAllFiles"
NOTFOUND=$?

# Note that we use an *arithmetic* test, not a string test, and that we have to
# invert the arithmetic value.

if ((!NOTFOUND)); then
  # not NOTFOUND is FOUND
  # ...
fi

Alternatywnie możesz zapisać dane wyjściowe w zmiennej, jeśli, tak jak w twoim przykładzie, potrzebujesz rzeczywistego ciągu. Jeśli tak, to rozwiązanie jest rozsądne, ale należy pamiętać, że analizowanie danych wyjściowych programów defaultsmoże być dość kruche, ponieważ niewielkie zmiany formatu spowodują, że wzorce nagle nie będą pasować. Staraj się, aby Twoje wzory były jak najbardziej ogólne:

# Here we use the `-m1` flag to stop matching as soon as the first line matches
ASAF_STRING=$(defaults read com.apple.Finder | grep -m1 "AppleShowAllFiles")

# Try to parse true or false out of the string. We do this in a subshell to
# avoid changing the shell option in the main shell.
ASAF=$(
  shopt -s nocasematch
  case $ASAF_STRING in 
    *true*) echo TRUE;;
    *false*) echo FALSE;;
    *) echo Could not parse AppleShowAllFiles >> /dev/stderr;;
  esac
)
rici
źródło
1

Widzę dwa sposoby na zrobienie tego, w zależności od tego, czy faktycznie potrzebujesz zmiennej więcej niż raz, czy nie.

Jeśli potrzebujesz zmiennej tylko raz, możesz po prostu połączyć grep z instrukcją if, tj

jeśli domyślne to czytaj com.apple.Finder | grep -q „AppleShowAllFiles”; następnie ...

Lub, jeśli musisz użyć zmiennej więcej niż raz, możesz zrobić coś takiego

domyślnie czytaj com.apple.Finder | grep -q „AppleShowAllFiles”

ASAF = $? ## $? jest równa wartości zwracanej przez ostatnie polecenie

if [„$ ASAF” -eq „0”]; następnie ...

Eric
źródło
Czy możesz dodać coś więcej do siebie, odpowiedz. Zauważyłem, że nie dzielisz instrukcji if / then na wiele wierszy. Umieszczasz znak ;na końcu linii i kontynuujesz, jak kończysz linię? Czy możesz dać mi prosty greptest. Nawet jeśli jest to tylko jibberish?
Danijel-James W
1

W ogóle nie musisz używać grep:

[[ $(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 readwypisuje wartości logiczne jako 1lub 0.

Tech29
źródło