Ask Different is a question and answer site for power users of Apple hardware and software. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I need to be able to write whether the test for a grep is either TRUE or FALSE to a variable so I can use it later

For the following, if I run

defaults read | grep "AppleShowAllFiles"

on my system, it would return

AppleShowAllFiles = FALSE;

Cool. So now I want to pipe this response to a test of some kind. This is where I get stuck.

I think if I can pipe/assign this output to a specified variable, I would be able to run a test on it. Now, just say, I've assigned the value of this output to a variable, in this case I will use $ASAF as my variable, I can run it in a test like this

if [ $ASAF = "AppleShowAllFiles = TRUE;" ]; then  
    defaults write AppleShowAllFiles FALSE  
    killall Finder  
    defaults write AppleShowAllFiles True  
    killall Finder  

If there is some other way to do this, I would be more than open to options. I've not had to do something like this for a while, and I'm a bit stumped. I searcehd Google a bit, but it was all answers without explanations and using the return value of 0 or 1. I think the returned output being assigned to a variable would be more appropriate, as then I can use it over and over in the script as need be.

share|improve this question
up vote 4 down vote accepted

You don't need to use grep at all:

[[ $(defaults read AppleShowAllFiles) = 0 ]] && bool=true || bool=false
defaults write AppleShowAllFiles -bool $bool
osascript -e 'quit app "Finder"'

defaults read prints boolean values as 1 or 0. For example True or YES as a string is also interpreted as a boolean value, but -bool true specifies the value to be actually boolean.

share|improve this answer
This is exactly what I want. Using the TRUE or FALSE values of a response. Even better than grep to test. Thank you! – Danijel-James W Sep 29 '13 at 1:32


if [[ $(defaults read | grep "AppleShowAllFiles") == "AppleShowAllFiles = TRUE;" ]]; then
    defaults write AppleShowAllFiles FALSE
    defaults write AppleShowAllFiles True
killall Finder

$(...) executes the part between ()and replaces it with the result. So you could also do

ASAF=$(defaults read | grep "AppleShowAllFiles")

to assign the result to $ASAF.

PS: I also changed two other things in your script

  • use [[ for the test part (has more functionality than [ and is builtin in bash
  • use == to compare strings (= is for assignments only`)
share|improve this answer
I'm looking at your edit of my post. How did you get the lines that start with defaults to indent further than the lines above and below? I tried to get that to work for formatting value, and it failed. :-/ – Danijel-James W Sep 28 '13 at 14:44
> is for quoting, 4 space characters are for code :-) – patrix Sep 28 '13 at 14:47
I found that I can assign the output directly to a variable when I invoke it using foofoo=$(defaults read | grep "foo"). I shall use your method in future. It seems more stable. – Danijel-James W Sep 28 '13 at 15:31
= can also be used for comparisons inside [[ and [/test in bash. POSIX defines = but not == (but POSIX doesn't define [[ either). – user495470 Sep 28 '13 at 17:43

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.