根据这个答案和我自己的理解,波浪号扩展到主目录:
$ echo ~
/home/braiam
Run Code Online (Sandbox Code Playgroud)
现在,每当我希望 shell 扩展工作时,即使用诸如 的变量名$FOO,并且不要因为意外的字符、诸如空格等而中断。应该使用双引号":
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Run Code Online (Sandbox Code Playgroud)
为什么这种扩展不适用于波浪号?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
Run Code Online (Sandbox Code Playgroud) 即使将其输出分配给变量,我也倾向于引用如下所示的命令替换:
var="$(command)"
Run Code Online (Sandbox Code Playgroud)
但这真的需要吗?什么时候断?此处接受的答案声称:
DIRNAME = “$(目录名称$ FILE)”不会做你想做的,如果$文件包含空格或的通配符[?*。
该链接指向 Gray Cat Wiki 关于引用的精彩页面,但该页面没有特别提及引用命令替换。虽然显然需要引用变量,但引用命令替换本身似乎并不需要。
然而,同一篇文章的结尾是:
DIRNAME="$(dirname "$FILE")" 是推荐的方式。您可以用命令和空格替换 DIRNAME= 而不更改任何其他内容,并且 dirname 接收正确的字符串。
这也是我一直以来的想法,并且经常在这里修改没有引用它的帖子。但是,链接到上面的维基页面也声称:
有几种情况可以安全地省略双引号:
在简单作业的右侧。你可以写 foo=$bar 不带引号。这是符合 POSIX 的。
[. . . ]
虽然var=$(command)不是真正的“简单”任务,但我仍然无法找到实际需要引号的情况:
$ var=$(echo "foo bar baz") ## whitespace works
$ echo "$var"
foo bar baz
$ var=$(printf "foo\nbar * baz") ## so do globbing characters
$ echo "$var"
foo
bar * baz
$ var1="foo\nbar * baz"
$ var=$(printf "$var1") ## printing …Run Code Online (Sandbox Code Playgroud) 这个问题是关于将一个变量的全部内容分配给另一个变量。
未使用变量(发送至echo等)
赋值期间没有进行参数扩展。
我的问题也仅与 POSIX shell 有关(此处未使用数组)。
error="You have an error in your input"
newVar="$error"
# vs.
newVar=$error
# ?
# ??This assignment is the question. It doesn't seem that quotes are
# needed here in order to assign the entire contents of $error to
# a new variable.
# ??(But quotes are required when they're used.)
# ?
printf "%s\n" "$error"
# => You have an error in your …Run Code Online (Sandbox Code Playgroud)