Bash

回顯/列印不帶引號的 bash ls 命令替換

  • June 22, 2022

我有以下範例:

$ a="$(ls)"
$ 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

現在有了printf

$ printf $a
backups
$
$ printf "$a"
backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp

為什麼輸出如此不同?在這種情況下,引號會做什麼?有人可以解釋這裡發生了什麼嗎?

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

echo $a是相同的

echo backups cache crash lib local lock log mail opt run snap spool tmp

echo "$a"

echo 'backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp'

請參閱https://mywiki.wooledge.org/Quotes

for 的第一個參數printf是一個格式化字元串,與它使用字元串作為格式並丟棄其餘參數printf $a相同,因為在格式化字元串中沒有任何東西可以使用它們。就像:printf backups cache crash lib local lock log mail opt run snap spool tmp``backups``%s

$ printf foo whatever
foo$
$ printf '%s\n' foo whatever
foo
whatever

不要a="$(ls)"嘗試創建一個包含文件名的標量變數,因為這很脆弱,a=(*)而是將它們保存在一個數組中。

引用自:https://unix.stackexchange.com/questions/707038