This is part of the rules of ~
-expansion. It is clearly stated in the Bash manual that this expansion is not performed when the ~
is quoted.
Workaround 1
Don't quote the ~
.
file=~/path/to/file
If you need to quote the rest of the filename:
file=~/"path with spaces/to/file"
(This is perfectly legal in a garden-variety shell.)
Workaround 2
Use $HOME
instead of ~
.
file="$HOME/path/to/file"
BTW: Shell variable types
You seem to be a little confused about the types of shell variables.
Everything is a string.
Repeat until it sinks in: Everything is a string. (Except integers, but they're mostly hacks on top of strings AFAIK. And arrays, but they're arrays of strings.)
This is a shell string: "foo"
. So is "42"
. So is 42
. So is foo
. If you don't need to quote things, it's reasonable not to; who wants to type "ls" "-la" "some/dir"
?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…