私は異なるタイトルのリストから複数の電子メールを送信する小さなスクリプトを書いた。
#!/bin/bash
while read -a line
do
mailadd=${line[0]}
subject=${line[1]}
mutt -s `echo $subject` `echo $mailadd` < /home/emanuele/testomail.txt
done < prova.txt
スクリプトはうまく機能し、メールを送信しますが、muttはオプションが必要だと言います-s
。
mutt: option requires an argument -- 's'
Mutt 1.5.21 (2010-09-15)
スクリプトが正しく機能する理由は理解できませんが、muttはエラーで終了します。どうすれば解決できますか?
答え1
まず、`echo $subject`
作成する方法が複雑です$subject
(スペースが含まれているか、値がわずかに破損している場合を除く)。\[*?
外部$subject
引用符は、スペースで区切られたワイルドカードパターンのリストとして扱われ、コマンド全体の置換の結果は次のようになります。スペースで区切られたワイルドカードパターンのリストから始まるものとして扱われます。
コマンドがこのエラーを引き起こす唯一の方法は、if`echo $subject` `echo $mailadd`
が空の場合です。これは`echo $subject`
、両方とも空白のみが含まれ、変数と両方が空の場合にのみ発生します(文字と単一の空白を含む名前を含む現在のファイルなどの奇妙な場合があります)。したがって、入力ファイルに空白行がある可能性が非常に高いです。`echo $mailadd`
subject
mailadd
subject
?
"$somevar"
"$(somecommand)"
変数の値をスペースで区切られたファイルワイルドカードパターンのリストとして解釈したい場合を除き、変数置換とコマンド置換(、)の周りに常に二重引用符を入れる必要があります。
mutt -s "$subject" "$mailaddr" <~/testeomail.txt
入力ファイルに空白行がある場合はスキップします。
while read -a line; do
mailadd=${line[0]}
subject=${line[1]}
if [ -z "$subject" ]; then continue; fi
mutt -s "$subject" "$mailadd" < /home/emanuele/testomail.txt
done < prova.txt