在Linux bash脚本中,我尝试使用mailx为我读取的文件的每一行发送1封电子邮件。行读取包含构建电子邮件的参数。我可以在此循环之外发送相同的电子邮件。感谢您的任何意见。
#!/bin/bash
in_email_file='./in_file.txt'
email_adr="address@somewhere.com"
while IFS='|' read -r subject body email
do
#these are echoed
echo "$subject"
echo "$body"
echo "$email"
#this does not get sent
echo "$body" | mailx -s "$subject" -r $email_adr $email
done < $in_email_file
#this gets sent
echo "Email body sent from outside loop" | mailx -s "Email subject sent from
outside loop" -r $email_adr $email_adr
正在读取的输入文件如下所示:
subject1|body1|address@domain.com
subject2|body2|address@domain.com
subject3|body3|address@domain.com
答案 0 :(得分:0)
你没有分享你试图在循环中运行的确切代码,但不管我怀疑这是一个带有bash脚本的occurrence of a common(令人沮丧的)绊脚石。可能,你试图在read
循环中做一些有趣的事情(即:陷阱的秘诀)。
tl; dr 以下是如何避免read
内的read
:
mapfile -t lines < "$in_email_file" # affectively one of the reads
for line in "${lines}";do #now no read occurs here
IFS=\| read subject body email < <(echo "$line")
# ... mailx thing you're doing
done
总结一下:使用内置的mapfile
,这样就可以编写一个普通的for
循环。阅读这个陷阱页面,以便有趣地了解bash循环可能会破坏你的大脑的不同方式。
<强> *编辑强>:
grep
电话,因为它似乎只是用它来制作猫?但是如果你想要grep,只需将其传递给mapfile
:mapfile -t lines < <(grep someExpression "$in_email_file")
help mapfile
了解更多