9

In Bash, when I do:

foo="*" echo $foo 

It expands * to the contents of the current folder. How do I make sure it just prints a literal *?

The same, by the way, happens with a regular echo "$foo", it prints the contents of the current folder.

2
  • Thanks @don_crissti: It works, but it prints the contents of the current folder. Commented Apr 20, 2015 at 22:23
  • @don_crissti My wrong! Sorry I read that too quickly. Can't believe I fell victim to this. Commented Apr 20, 2015 at 22:29

1 Answer 1

16

Let us define foo:

$ foo="*" 

Now, try echo without quotes:

$ echo $foo File1 File2 

The replacement of * with a list of filenames is called pathname expansion. It can be suppressed with with double-quotes:

$ echo "$foo" * 

In addition, double-quotes will prevent brace expansion, tilde expansion, and word splitting.

For completeness, try echo with single quotes:

$ echo '$foo' $foo 

Single quotes prevent the shell from making any substitutions at all.

1
  • 2
    Of course! I can't believe I missed this. I kept thinking of quoting the original assignment, not the expansion on the echo statement itself! Commented Apr 20, 2015 at 22:30

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.