シングルクォートを使用したbash変数の展開に関する問題

シングルクォートを使用したbash変数の展開に関する問題

次のように構築する変数があります:

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

変数には次の内容が含まれます (ファイル名の空白に注意してください)。

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

そして、この変数を次のようなコマンドで使用したいと思います。

mutt -s "Subject" "${ATTSTR}" [email protected]

しかし、実際には次のように展開されるため、コマンドは失敗します (展開された変数を囲む単一引用符が追加されていることに注意してください)。

mutt -s "Subject" ' -a "/tmp/Testpage - PDFCreator.pdf"' [email protected]

変数を一重引用符なしで展開したいのですが、"$ATTSTR"またはを使用するのは$ATTSTRもっと悪いです。どうすればこれを実現できますか?

答え1

ファイル名は拡張文字列では信頼性が低いことで有名です。この誘惑に抵抗してください。

代わりに、配列空白文字に関係なくファイル名をそのまま維持するには:

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

# and for usage/display:

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

を参照してください配列に関する Bash ガイド参考のため。

答え2

eval関数を使用する

command="mutt -s \"Subject\" $ATTSTR [email protected]"
response=$(eval "$command")

関連情報