나는 다른 제목의 목록에서 여러 이메일을 보내는 작은 스크립트를 작성했습니다.
#!/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