On Mon, Aug 12, 2019 at 01:56:46PM -0400, Lee wrote:
> What's the difference between ${d} and "${d}"?  Or is that a bashism
> also? (all my scripts use /bin/sh so I'm pretty clueless wrt bash)

This applies to both sh and bash.

An unquoted substitution, like $d or ${d}, undergoes several steps.  The
first step is actually copying the contents of the variable.  After that
comes word splitting (dividing the content into words/fields using IFS),
and then pathname expansion ("globbing").

I have a helper script called "args" which I use to illustrate this stuff.

wooledg:~$ cat bin/args
#!/bin/sh
printf "%d args:" "$#"
printf " <%s>" "$@"
echo

Using that, we can demonstrate:

wooledg:~$ d="a variable"
wooledg:~$ args "$d"
1 args: <a variable>
wooledg:~$ args $d
2 args: <a> <variable>

The curly braces don't matter in this case, because there's nothing after
the $d for it to matter.

wooledg:~$ args ${d}
2 args: <a> <variable>

The curly braces are only needed because of the _stuff after the d.
Without them, d_stuff is treated as a variable name.

wooledg:~$ args "$d_stuff"
1 args: <>
wooledg:~$ args "${d}_stuff"
1 args: <a variable_stuff>

The quotes are still needed.  Without them, we still get word splitting
and pathname expansion.

wooledg:~$ args ${d}_stuff
2 args: <a> <variable_stuff>


For more details, see <https://mywiki.wooledge.org/Quotes>.

Reply via email to