Storing a directory name with spaces in a bash variable

bashfile

(Note: after some more research I have a partial answer, but I don't like having to write the actual commands against that variable differently depending on embedded spaces or not. I'll accept better suggestions).

I like to store various work variables in bash as I am working on something. This avoids having to type it up every time and also helps when you come back to work on it some time later (stick the assignment in a localprofile.sh file and source that later…).

I'd like to store a directory name with spaces in it. I know how to do deal with spaces in file/directory names interactively, using either quoting or \-based escaping:

$ ls -1 /Users/myuser/Library/Application\ Support/ | tail -5
iTerm2
icdd
org.videolan.vlc
pip
videosubscriptionsd

or

$ ls -1 "/Users/myuser/Library/Application Support/" | tail -5
iTerm2
icdd
org.videolan.vlc
pip
videosubscriptionsd

Now I'd like to assign that directory to a bash $dn variable and that's not working so well.

Here are some various tries. On purpose I stayed away from ~-based shell extension.

dn='/Users/myuser/Library/Application Support/'
echo ''
echo ''
echo $dn
ls -1 $dn

dn='"/Users/myuser/Library/Application Support/"'
echo ''
echo ''
echo $dn
ls -1 $dn

dn=/Users/myuser/Library/Application\ Support/
echo ''
echo ''
echo $dn
ls -1 $dn

dn="/Users/myuser/Library/Application\ Support/"
echo ''
echo ''
echo $dn
ls -1 $dn

each one of these shows a variation on ls: /Users/myuser/Library/Application\: No such file or directory

Best Answer

OK, found this by broadening by googling without specifying mac or osx - this is a generic bash issue: Stackoverflow how to add path with space in bash variable

And, translating that to my question, both "interactive approaches", i.e. quoting or \-escaping work, as long as you wrap the bash variable in its own double-quotes when you run the commands:

dn='/Users/myuser/Library/Application Support/'
ls -1 "$dn" | tail -5

dn=/Users/myuser/Library/Application\ Support/
ls -1 "$dn" | tail -5

Don't use single quotes above - there is no bash substitution happening in that case and you get ls: $dn: No such file or directory.

The drawback here is having to wrap the variables in double-quotes or not depending on embedded spaces.

dn="'/Users/myuser/Library/Application Support/'" and then not having quotes doesn't work, btw.