スペースを含むいくつかの Windows パスを使用する Bash スクリプト (Cygwin) があります。\
その結果、変数定義で a を使用してスペースをエスケープしました。
スクリプト内のすべてが正常に機能します。ただし、この変数を引数としてコマンドライン実行可能ファイルに渡す必要があります。そうなると、逃げ道がめちゃくちゃになる。
機能しないスクリプトの例:
#!/bin/sh
# File paths
destinationPath="/cygdrive/c/Documents and Settings/Eric/My Documents/"
attachments="\n2013-12-12.pdf"
body="Test Body"
recipient="asdf@asdf.com"
# Prepare attachments
args=""
for file in $attachments ; do
file=${file//[ \\n]/}
touch $file
mv $file "$destinationPath/$file"
args="$args -a $destinationPath/$file"
done
# Send email
echo -e $body | email --from-addr nosender@mydomain.com --from-name "Automated CSS Downloader" --subject "Downloaded new file(s) \
from CSS" $args eric@mydomain.com
スクリプトからの出力:
$ bash -x test.sh
+ destinationPath='/cygdrive/c/Documents and Settings/Eric/My Documents/'
+ attachments='\n2013-12-12.pdf'
+ body='Test Body'
+ recipient=asdf@asdf.com
+ args=
+ for file in '$attachments'
+ file=2013-12-12.pdf
+ touch 2013-12-12.pdf
+ mv 2013-12-12.pdf '/cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf'
mv: listing attributes of `2013-12-12.pdf': Invalid argument
+ args=' -a /cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf'
+ echo -e Test Body
+ email --from-addr nosender@mydomain.com --from-name 'Automated CSS Downloader' --subject 'Downloaded new file(s) from CSS' -a /cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf eric@mydomain.com
email: WARNING: Email address 'and' is invalid. Skipping...
email: FATAL: Could not open attachment: /cygdrive/c/Documents: No such file or directory
ご覧のとおり、パス内のエスケープされたスペースは $args 変数にエクスポートされていません。エラーが「args = ...」の行にあると想定しています。しかし、エスケープされた文字が確実に保持されるように $destinationPath をエスケープする方法がわかりません。
destinationPath で二重引用符 (エスケープスペースなし) を使用しようとしましたが、役に立ちませんでした。$destinationPath を args= 行で二重引用符にしようとすると、余分な引用符がたくさん付いて出力が台無しになります。
どうすればこれを機能させることができますか? 私は $IFS 変数をいじってみましたが、私はそれで何をしているのか本当にわかりません. IFS。