有人可以解释我为什么这样做吗(列出名称中带有空格的目录的内容):
ret="$(ls "my dir")"
难道它不应该被解释为:
ret="$(ls "
my dir
")"
例如:
ls "my" "dir"
和
ls "my dir"
答案1
到目前为止最好的猜测似乎是你问的是:
命令
ret="$(ls"我的目录")"是一个包含四个双引号 ( ) 的命令的糟糕示例
"
。有人可能会天真地认为第二个引号会匹配第一个引号,第四个引号会匹配第三个引号,如下所示:ret="$(ls "my dir")" ↑-----↑ ↑-↑
例如
eat "afternoon snack" dinner "midnight snack"
相反,它确实“起作用”了,如下所示:
ret="$(ls"我的目录")" ↑ ↑------↑ ↑ ↑--------------↑为什么嵌套的引号要这样解析?
这段重击(1) 可以解释一下:
命令替换
⋮
…使用该形式时,括号之间的所有字符组成命令...。$(command)
$(
我猜这意味着你所观察到的,即,和之间的文本)
被视为一个单独的命令,有自己的引号解析/配对,独立于括号外的语法元素。我承认,如果你不寻找那个意思,它很难解释。
$
但你的问题,就其所写而言,毫无意义。整个事情取决于shell的非常特殊的含义。如果我们将其更改为其他货币符号,
ret="£(ls "my dir")"
那么它将被视为两个单词:
ret="£(ls "my
(其次是)
dir")"
因为,如果非空白、非特殊字符出现在开始引号之前或结束引号之后,它将与引号内的字符包含在同一个字符串中。例如,
cat Wal"*"mart
查找名为 的文件Wal*mart
,而不是名为 的文件Wal
、名为 的文件*
和名为 的文件mart
—
Wal"*"mart
相当于Wal\*mart
和"Wal*mart"
。类似地,以下示例显示四个单词:
一” “两扣” 我的“鞋子/不/是/一个/” “/cadet sqrt”(2)” ↑-------↑ ↑-----------↑ ↑--------------------↑ ↑-------↑
我不知道您问题中展示的三行细目是从哪里来的。