Конвейерный вывод grep в переменную

Мне нужно иметь возможность написать, является ли тест для grep ИСТИННЫМ или ЛОЖНЫМ для переменной, чтобы я мог использовать ее позже.

Для следующего, если я запускаю

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

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

AppleShowAllFiles = FALSE;

Прохладный. Итак, теперь я хочу направить этот ответ на какой-то тест. Вот тут я застрял.

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

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

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

Ответы (2)

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. Например True, or YESпоскольку строка также интерпретируется как логическое значение, но -bool trueуказывает, что значение на самом деле является логическим.

Это именно то, что я хочу. Используя TRUEили FALSEзначения ответа. Даже лучше, чем grepтестировать. Спасибо!

Пытаться

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

$(...)выполняет часть между ними ()и заменяет ее результатом. Таким образом, вы также можете сделать

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

чтобы присвоить результат $ASAF.

PS: я также изменил две другие вещи в вашем сценарии.

  • использовать [[для тестовой части (имеет больше функциональности, чем [и встроен в bash
  • использовать ==для сравнения строк ( =только для присваиваний`)
Я смотрю на вашу правку моего поста. Как вы добились того, чтобы строки, начинающиеся с, defaults write.com.appleимели больший отступ, чем строки выше и ниже? Я попытался заставить это работать для значения форматирования, и это не удалось. :-/
>для кавычек, 4 пробела для кода :-)
Я обнаружил, что могу назначить вывод непосредственно переменной, когда я вызываю ее с помощью foofoo=$(defaults read com.apple.foobar | grep "foo"). В будущем воспользуюсь вашим методом. Вроде стабильнее.
=также можно использовать для сравнения внутри [[и [/ testв bash. POSIX определяет =, но не определяет ==(но POSIX также не определяет [[).