Saída de pipe do grep para uma variável

4

Eu preciso ser capaz de escrever se o teste para um grep é TRUE ou FALSE para uma variável para que eu possa usá-lo mais tarde

Para o seguinte, se eu correr

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

no meu sistema, voltaria

AppleShowAllFiles = FALSE;

Legal. Então agora eu quero canalizar essa resposta para um teste de algum tipo. É aqui que fico preso.

Eu acho que se eu puder canalizar / atribuir essa saída a uma variável especificada, eu seria capaz de executar um teste nela. Agora, basta dizer, eu atribuí o valor desta saída para uma variável, neste caso, vou usar $ASAFcomo minha variável, eu posso executá-lo em um teste como este

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

Se houver alguma outra maneira de fazer isso, eu estaria mais do que aberto a opções. Eu não tive que fazer algo assim por um tempo, e estou um pouco perplexo. Eu pesquisei o Google um pouco, mas foi tudo respostas sem explicações e usando o valor de retorno de 0ou 1. Acho que a saída retornada sendo atribuída a uma variável seria mais apropriada, pois eu posso usá-la repetidamente no script, conforme necessário.

Danijel-James W
fonte

Respostas:

4

Você não precisa usar grepnada:

[[ $(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 readimprime valores booleanos como 1ou 0. Por exemplo, Trueou YEScomo uma string, também é interpretado como um valor booleano, mas -bool trueespecifica que o valor seja realmente booleano.

Lri
fonte
Isso é exatamente o que eu quero. Usando os valores TRUEou FALSEde uma resposta. Ainda melhor do grepque testar. Obrigado!
Danijel-James W
3

Experimentar

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

$(...)executa a parte entre ()e substitui com o resultado. Então você também pode fazer

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

para atribuir o resultado a $ASAF.

PS: Eu também mudei duas outras coisas no seu script

  • usar [[para a parte de teste (tem mais funcionalidade do que [e é embutido no bash
  • use ==para comparar strings ( =é somente para atribuições)
nohillside
fonte
1
Eu estou olhando para a sua edição do meu post. Como você conseguiu as linhas que começam com defaults write.com.applerecuar mais do que as linhas acima e abaixo? Eu tentei fazer isso funcionar para o valor de formatação e ele falhou. : - /
Danijel-James W
>é para citar, 4 caracteres de espaço são para o código :-)
nohillside
1
Descobri que posso atribuir a saída diretamente a uma variável quando a invoco usando foofoo=$(defaults read com.apple.foobar | grep "foo"). Eu usarei seu método no futuro. Parece mais estável.
Danijel-James W
=também pode ser usado para comparações dentro [[e [/ testno bash. O POSIX define =mas não ==(mas o POSIX não define [[nenhum dos dois).
Lri