當我使用 列印文件內容時echo $(cat /path/to/filename)
,它也會列出我的文件和說明。但當我這樣做時printf "$(cat /path/to/filename)\n"
效果很好。
我也嘗試將其保存到變數中content='cat /path/to/filename'
(也content=$(cat /path/to/filename
),然後按 列印echo $content
,但我得到了相同的結果(列出文件和方向)。
我想將文件的內容儲存到變數中,並將變數傳遞到我的腳本中作為下一個命令的輸入。
請注意,我的文件的內容有特殊字元*
。
答案1
因為執行命令替換後,如果不引用它們,shell 會對結果執行單字分割(或欄位分割)。
POSIX 定義單字擴充作為:
單字擴展的順序如下:
應從頭到尾執行波形符擴展(請參閱波形符擴展)、參數擴展(請參閱參數擴展)、命令替換(請參閱命令替換)和算術擴展(請參閱算術擴展)。請參閱令牌識別中的第 5 項。
欄位分割(請參閱欄位分割)應在步驟 1 產生的欄位部分上執行,除非 IFS 為空。
除非 set -f 有效,否則應執行路徑名擴充(請參閱路徑名擴充)。
報價刪除(請參閱報價刪除)應始終最後執行。
在您的情況下,*
符合目前工作目錄中的所有內容。您必須引用結果才能獲得預期的輸出:
echo "$(cat /path/to/fileName)"
答案2
引用一下:
$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*
作為第一條規則,始終引用命令替換。
除非您關閉通配符(或)或引用/轉義它:否則裸露的內容*
將在 中擴展。對於命令輸出,最好使用引號。bash
set -f
setopt noglob
"*" \*