How to assign a glob expression to a variable in a Bash script?

I think it is the order of expansions:

The order of expansions is: brace
expansion
, tilde expansion, parameter,
variable and arithmetic expansion and
command substitution (done in a
left-to-right fashion), word
splitting, and pathname expansion.

So if your variable is substituted, brace expansion doesn’t take place anymore. This works for me:

eval ls $dirs

Be very careful with eval. It will execute the stuff verbatimly. So if dirs contains f{m,k}t*; some_command, some_command will be executed after the ls finished. It will execute the string you give to eval in the current shell. It will pass /content/dev01 /content/dev02 to ls, whether they exist or not. Putting * after the stuff makes it a pathname-expansion, and it will omit non-existing paths:

dirs=/content/{dev01,dev02}*

I’m not 100% sure about this, but it makes sense to me.

Leave a Comment