相关疑难解决方法(0)

为什么波浪号 (~) 不在双引号内展开?

根据这个答案和我自己的理解,波浪号扩展到主目录:

$ 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)

shell

68
推荐指数
4
解决办法
2万
查看次数

将输出分配给变量时是否需要引用命令替换?

即使将其输出分配给变量,我也倾向于引用如下所示的命令替换:

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)

shell quoting command-substitution

6
推荐指数
2
解决办法
246
查看次数

在不使用引号的情况下在 shell 中将一个变量分配给另一个变量有什么问题吗?

这个问题是关于一个变量的全部内容分配给另一个变量。

使用变量(发送至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)

shell posix quoting assignment

5
推荐指数
1
解决办法
2729
查看次数

标签 统计

shell ×3

quoting ×2

assignment ×1

command-substitution ×1

posix ×1