Linux Bash。从读取文件行的​​while循环内发送mailx

时间:2017-06-29 02:48:59

标签: linux bash mailx ifs

在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

1 个答案:

答案 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,只需将其传递给mapfilemapfile -t lines < <(grep someExpression "$in_email_file")
  • help mapfile了解更多