Bash回顯/列印不帶引號的 bash
回顯/列印不帶引號的 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
行為的解釋: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=(*)
而是將它們保存在一個數組中。