Pipe salida de grep a una variable

Necesito poder escribir si la prueba para un grep es VERDADERO o FALSO en una variable para poder usarla más tarde

Para lo siguiente, si corro

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

en mi sistema, volvería

AppleShowAllFiles = FALSE;

Fresco. Así que ahora quiero canalizar esta respuesta a una prueba de algún tipo. Aquí es donde me quedo atascado.

Creo que si puedo canalizar/asignar esta salida a una variable específica, podría ejecutar una prueba en ella. Ahora, solo diga, asigné el valor de esta salida a una variable, en este caso la usaré $ASAFcomo mi variable, puedo ejecutarla en una prueba como esta

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

Si hay alguna otra forma de hacer esto, estaría más que abierto a las opciones. No he tenido que hacer algo como esto por un tiempo, y estoy un poco perplejo. Busqué un poco en Google, pero todas eran respuestas sin explicaciones y usando el valor de retorno de 0o 1. Creo que la salida devuelta que se asigna a una variable sería más apropiada, ya que puedo usarla una y otra vez en el script según sea necesario.

Respuestas (2)

No es necesario utilizar grepen absoluto:

[[ $(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 1o 0. Por ejemplo True, or YESas a string también se interpreta como un valor booleano, pero -bool trueespecifica que el valor sea realmente booleano.

Esto es exactamente lo que quiero. Usar los valores TRUEo FALSEde una respuesta. Incluso mejor que grepprobar. ¡Gracias!

Intentar

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

$(...)ejecuta la parte intermedia ()y la reemplaza con el resultado. Así que también podrías hacer

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

para asignar el resultado a $ASAF.

PD: También cambié otras dos cosas en tu guión.

  • uso [[para la parte de prueba (tiene más funcionalidad que [y está integrado en bash
  • usar ==para comparar cadenas ( =es solo para asignaciones`)
Estoy viendo tu edición de mi publicación. ¿Cómo conseguiste que las líneas que comienzan con defaults write.com.appletuvieran una sangría mayor que las líneas de arriba y de abajo? Traté de hacer que eso funcionara para formatear el valor, y falló. :-/
>es para citar, 4 caracteres de espacio son para el código :-)
Descubrí que puedo asignar la salida directamente a una variable cuando la invoco usando foofoo=$(defaults read com.apple.foobar | grep "foo"). Usaré tu método en el futuro. Parece más estable.
=también se puede usar para comparaciones internas [[y [/o testen bash. POSIX define =pero no ==(pero POSIX tampoco define [[).