回显/打印不带引号的 bash `ls` 命令替换

t7e*_*t7e 2 bash command-substitution

我有以下示例:

$ a="$(ls)"
Run Code Online (Sandbox Code Playgroud)
$ echo $a
backups cache crash lib local lock log mail opt run snap spool tmp
$
$ echo "$a"
backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp
Run Code Online (Sandbox Code Playgroud)

现在printf

$ printf $a
backups
$
$ printf "$a"
backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp
Run Code Online (Sandbox Code Playgroud)

为什么输出如此不同?在这种情况下,报价有什么作用?有人可以解释一下这是怎么回事吗?

PS 找到了有关该ls行为的一些解释:
ls 的输出有换行符,但显示在单行上。为什么?
https://superuser.com/questions/424246/what-is-the-magic-separator- Between-filenames-in-ls-output
http://mywiki.wooledge.org/ParsingLs
可以通过这种方式检查换行符:

ls | od -c
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 6

echo $a是相同的

echo backups cache crash lib local lock log mail opt run snap spool tmp
Run Code Online (Sandbox Code Playgroud)

echo "$a"与相同

echo 'backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp'
Run Code Online (Sandbox Code Playgroud)

请参阅https://mywiki.wooledge.org/Quotes

第一个参数printf是格式化字符串,与printf $a它相同,printf backups cache crash lib local lock log mail opt run snap spool tmp因此它使用该字符串backups作为格式并丢弃其余部分,因为格式化字符串中没有任何东西%s可以使用它们。就像:

$ printf foo whatever
foo$
Run Code Online (Sandbox Code Playgroud)

$ printf '%s\n' foo whatever
foo
whatever
Run Code Online (Sandbox Code Playgroud)

不要a="$(ls)"尝试创建一个保存文件名的标量变量,因为它很脆弱,a=(*)而是将它们保存在数组中。

  • @t7e 简而言之,“echo”输出其参数,参数之间有空格。这就是“echo”的作用。当使用“echo $a”时,shell 根据空格、制表符和换行符将“$a”的内容拆分为多个参数(然后还会对每个生成的单词进行文件名通配)。然后 `echo` 打印它们,并在它们之间留有空格。使用 `echo "$a"` 时,您只需要给 `echo` 一个参数。字符串“$a”包含来自“ls”输出的换行符,这些换行符由“echo”保留并输出。 (2认同)

归档时间:

查看次数:

977 次

最近记录:

3 年,3 月 前