On Fri, Oct 16, 2020 at 11:29:34PM -0700, Will Mengarini wrote: > debian/pts/14 bash ~ 23:25 0$a="x y z" > debian/pts/14 bash ~ 23:25 0$echo $a > x y z > debian/pts/14 bash ~ 23:26 0$echo "$a" # preferred > x y z > debian/pts/14 bash ~ 23:26 0$# When $a is embedded, quote *outer* string: > debian/pts/14 bash ~ 23:27 0$echo "foo $a bar" > foo x y z bar > debian/pts/14 bash ~ 23:27 0$
You're so close here, but you drew the wrong conclusion. When creating an array variable that contains a list of arguments, you want each argument to be passed separately. That's the entire purpose and point of the array variable. unicorn:~$ args=(-v CFLAGS="-g -O" -q) unicorn:~$ printf '{%s} ' "${args[@]}"; echo {-v} {CFLAGS=-g -O} {-q} Use an array variable, not a string variable, to hold a list of arguments. Use the quoted [@] expansion to expand the array variable. args=(... your arguments here ...) somecmd "${args[@]}" Any other usage is wrong, and will cause bugs eventually. See also <https://mywiki.wooledge.org/BashFAQ/050>.