Diego Herranz
Diego Herranz

Reputation: 2937

Behavior I don't understand in bash

I have a folder with 3 dummy files: ab0, ab1 and ab2.

$ echo ab*
ab0 ab1 ab2

$ myvariable=ab*
$ echo $myvariable
ab0 ab1 ab2

$ echo 'ab*'
ab*

Up to here, I think I understand. But:

$ myvariable='ab*'
$ echo $myvariable
ab0 ab1 ab2

I was expecting ab*. This means that there is a basic that I don't understand.

I've been searching for single vs double quotes, expansion and more in bash tutorials and manuals but I don't get it yet.

Upvotes: 8

Views: 80

Answers (2)

jprice
jprice

Reputation: 9925

BASH isn't performing the expansion during the assignment, its expanding when you run the echo command. So with both kinds of quotes, you are storing the raw string ab* to your variable. To see this behaviour in action, use quotes when you echo as well:

hephaestus:foo james$ echo ab*
ab0 ab1 ab2
hephaestus:foo james$ var=ab*
hephaestus:foo james$ echo $var
ab0 ab1 ab2
hephaestus:foo james$ echo "$var"
ab*
hephaestus:foo james$ var='ab*'
hephaestus:foo james$ echo $var
ab0 ab1 ab2
hephaestus:foo james$ echo "$var"
ab*
hephaestus:foo james$

Upvotes: 2

Andrey Mishchenko
Andrey Mishchenko

Reputation: 4206

The line $ echo $myvariable is being parsed by first substituting the contents of $myvariable into the line, then running the line. So when the line is parsed by bash, it looks like $ echo ab*.

If you $ echo "$myvariable", you will get the behavior you want.

Upvotes: 7

Related Questions