Мне нужно иметь возможность написать, является ли тест для grep TRUE или FALSE для переменной, чтобы я мог использовать его позже

Для следующего, если я бегу

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

в моей системе, он вернется

AppleShowAllFiles = FALSE;

Здорово. Так что теперь я хочу передать этот ответ на какой-то тест. Вот где я застреваю.

Я думаю, что если я смогу передать / назначить этот вывод указанной переменной, я смог бы выполнить тест на нем. Теперь просто скажите, что я присвоил значение этого вывода переменной, в этом случае я буду использовать $ASAF качестве моей переменной, я могу запустить его в таком тесте, как этот

if [$ ASAF = "AppleShowAllFiles = TRUE;" ]; затем
по умолчанию пишите com.apple.Finder AppleShowAllFiles FALSE
killall Finder
еще
по умолчанию пишите com.apple.Искатель AppleShowAllFiles True
killall Finder
фи

Если есть какой-то другой способ сделать это, я был бы более чем открыт для вариантов. Некоторое время мне не приходилось делать что-то подобное, и я немного озадачен. Я немного искал Google, но это были все ответы без объяснений и с использованием возвращаемого значения 0 или 1 . Я думаю, что возвращенный вывод, назначенный переменной, был бы более уместным, так как тогда я мог бы использовать его снова и снова в сценарии по мере необходимости.

3 ответа3

1

Я вижу два способа сделать это, в зависимости от того, нужна ли вам переменная более одного раза или нет.

Если вам нужна переменная только один раз, вы можете просто объединить grep в свой оператор if, т.е.

если по умолчанию читайте com.apple.Искатель | grep -q "AppleShowAllFiles"; затем ...

Или, если вам нужно использовать переменную более одного раза, вы можете сделать что-то вроде этого

по умолчанию читайте com.apple.Искатель | grep -q "AppleShowAllFiles"

ASAF = $? ## $? равно возвращаемому значению последней команды

if ["$ ASAF" -eq "0"]; затем ...

1

Если вы просто хотите сохранить код возврата (успех / неудача) команды, используйте $?:

# 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

В качестве альтернативы вы можете сохранить вывод в переменную, если, как в вашем примере, вам нужна действительная строка. Если это так, ваше решение разумно, но имейте в виду, что анализ выходных данных программ, таких как defaults может быть довольно хрупким, так как незначительные изменения формата приведут к тому, что шаблоны внезапно не будут соответствовать. Постарайтесь сделать ваши шаблоны как можно более общими:

# 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
)
1

Вам не нужно использовать 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 read печатает логические значения как 1 или 0 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .