引用符なしでEcho / print bash `ls`コマンドを置き換える

引用符なしでEcho / print bash `ls`コマンドを置き換える

次の例があります。

$ 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の出力には改行文字がありますが、1行に表示されます。なぜ?
https://superuser.com/questions/424246/what-is-the-magic-separator- Between-filenames-in-ls-output
http://mywiki.wooledge.org/ParsingLs
次のように改行文字を確認できます。

ls | od -c

ベストアンサー1

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

最初の引数はそれと同じprintf書式文字列なので、その文字列を型として使用し、型文字列に使用する項目がないため、残りは破棄します。良い:printf $aprintf backups cache crash lib local lock log mail opt run snap spool tmpbackups%s

$ printf foo whatever
foo$

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

a="$(ls)"ファイル名を保存するスカラー変数は壊れやすいので、生成せずに配列にa=(*)保存してください。

おすすめ記事