簡體   English   中英

Linux Bash。 從讀取文件行的​​while循環內發送mailx

[英]Linux Bash. Send mailx from inside a while loop that reads lines of a file

在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

您沒有共享要在循環內運行的確切代碼,但是不管我懷疑這是bash腳本發生常見 (令人沮喪)絆腳石的情況。 您可能正在嘗試在read循環內做一些有趣的事情(即:陷阱的秘訣)。

tl; dr這是在read s中避免read s的方法:

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更多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM