Linux

使用單引號擴展 bash 變數的問題

  • February 17, 2021

我有一個像這樣建構的變數:

ATTSTR=""
for file in $LOCALDIR/*.pdf
do
 ATTSTR="${ATTSTR} -a \"${file}\""
done

該變數現在包含(注意文件名中的空格):

ATTSTR=' -a "/tmp/Testpage - PDFCreator.pdf"'

現在我想在這樣的命令中使用這個變數:

mutt -s "Subject" "${ATTSTR}" recipient@example.ec

但事實證明它像這樣擴展,因此命令失敗(注意擴展變數周圍添加的單引號):

mutt -s "Subject" ' -a "/tmp/Testpage - PDFCreator.pdf"' recipient@example.ec

我希望我的變數在沒有單引號的情況下展開,使用"$ATTSTR"or$ATTSTR更糟。我怎樣才能做到這一點?

眾所周知,擴展字元串中的文件名不可靠;抵制這種誘惑。

相反,請使用數組來保持文件名完整,而不管任何空格:

arr=()
for f in $somedir/*.pdf
do
arr+=( -a "$f")
done

# and for usage/display:

mutt -s mysubject "${a[@]}" some@body

請參閱有關數組的 Bash 指南以供參考。

使用評估功能

command="mutt -s \"Subject\" $ATTSTR recipient@example.ec"
response=$(eval "$command")

引用自:https://serverfault.com/questions/420374