2017-06-01 63 views
0

我有一个脚本直到遇到第二个($ sqlSenderID)和第三个($ sqlEmail)时才会遇到问题。Bash嵌套for循环始终在第一行开始

它做了什么它通过$ sqlEmail运行5次(因为它发现5封电子邮件),然后它改变id并再次做同样的事情,从而返回错误的信息。

我想让$ sqlEmail停止并在第一次运行后转到$ senderID,然后它必须再次通过新的ID和电子邮件运行。

如果我添加在$ sqlEmail循环休息的可以追溯到但它在报告相同的电子邮件地址,并在

任何帮助将不胜感激

我的代码:

code

for i in $sqlSenderID 
    do 
    for e in $sqlEmail 
    do 
     sqlBannerExp=$(sudo -upostgres psql -d db -t -c "select \"endTime\" from \"lnkSenderTag\" where \"senderId\" = '$i' and \"endTime\" != 'infinity' and \"endTime\" <= 'now'::date;") 
     if [[ -n $sqlBannerExp ]]; then 
     echo "$e Banner Expired" >> Banner.txt 
     fi 
     sqlBannerSoon=$(sudo -upostgres psql -d db -t -c "select \"endTime\" from \"lnkSenderTag\" where \"senderId\" = '$i' and \"endTime\" != 'infinity' and \"endTime\" = (current_date + interval '1 day');") 
     if [[ -n $sqlBannerSoon ]]; then 
     echo "$e Banner Expiring Soon" >> Banner.txt 
     fi 
     sqlBannerNo=$(sudo -upostgres psql -d db -t -c "select branded from maillog where sender = '$i' and branded is null;") 
     if [[ -n $sqlBannerNo ]]; then 
     echo "$e No Banner Assigned" >> Banner.txt 
     fi 
     sqlSignatureNo=$(sudo -upostgres psql -d db -t -c "select tagtype from branding where senderid = '$i' and tagtype != 'Template' and tagtype != 'Disclaimer';") 
     if [[ -z $sqlSignatureNo ]]; then 
     echo "$e No Signature Assigned" >> Banner.txt 
     fi 
     echo "$e" >> test.txt 
     break 
    done 
    echo "" >> Banner.txt 
    done 

发件人ID将类似于451 452 453 845 22472

+1

请您可以修复您的格式?我猜想整件事不应该在反引号内,而且'>'也不应该在那里。 –

+0

我已经删除反引号,对不起,这是偶然添加它的网站 – Dreamsword981

+1

好吧,现在看起来好多了,但仍有很多代码需要挖掘。你可以尝试给我们提供[mcve]吗? –

回答

0

你想并行迭代两个列表,为此我将使用数组。

sqlSenderID=(1 2 3) 
sqlEmail=([email protected] [email protected] [email protected]) 

do_sql() { 
    sudo -upostgres psql -d db -t -c "$1" 
} 

for ((j=0; j< ${#sqlSenderID}; j++)); do 
    i=${sqlSenderID[i]} 
    e=${sqlEmail[i]} 

    sqlBannerExp=$(do_sql "select \"endTime\" from \"lnkSenderTag\" where \"senderId\" = '$i' and \"endTime\" != 'infinity' and \"endTime\" <= 'now'::date;") 
    if [[ -n $sqlBannerExp ]]; then 
    echo "$e Banner Expired" 
    fi 
    sqlBannerSoon=$(do_sql "select \"endTime\" from \"lnkSenderTag\" where \"senderId\" = '$i' and \"endTime\" != 'infinity' and \"endTime\" = (current_date + interval '1 day');") 
    if [[ -n $sqlBannerSoon ]]; then 
    echo "$e Banner Expiring Soon" 
    fi 
    sqlBannerNo=$(do_sql "select branded from maillog where sender = '$i' and branded is null;") 
    if [[ -n $sqlBannerNo ]]; then 
    echo "$e No Banner Assigned" 
    fi 
    sqlSignatureNo=$(do_sql "select tagtype from branding where senderid = '$i' and tagtype != 'Template' and tagtype != 'Disclaimer';") 
    if [[ -z $sqlSignatureNo ]]; then 
    echo "$e No Signature Assigned" 
    fi 

done >> Banner.txt 

需要注意的是,除非你有超过两个列表中的内容完整控制,生成SQL语句动态这样很容易出现SQL注入攻击。考虑使用具有适当SQL库的语言。

+0

谢谢你,但不幸的是发件人ID不遵循订购。但是代码失败。 – Dreamsword981

0

我设法做了一个很好的工作方式。

它创建n个空格阵列项目,我不知道该怎么

唯一要摆脱它

SenderID=() 
    while read -r output_line; do 
    SenderID+=("$output_line") 
    done < <(do_sql "select id from \"mstPerson\" where \"parentAccountId\" = '$f' and email LIKE '%@$d%' and id is not null order by id asc;") 

    Email=() 
    while read -r output_line; do 
    Email+=("$output_line") 
    done < <(do_sql "select email from \"mstPerson\" where \"parentAccountId\" = '$f' and email LIKE '%@$d%' and email is not null order by id asc;") 

    echo "${sqlAccountName// }" >> Banner.txt 
    echo "" >> Banner.txt 
    done 

    for i in "${SenderID[@]}" 
    do 

    sqlBannerExp=$(do_sql "select \"endTime\" from \"lnkSenderTag\" where \"senderId\" = '$i' and \"endTime\" != 'infinity' and \"endTime\" <= 'now'::date;") 
    if [[ -n $sqlBannerExp ]]; then 
     echo "${Email[i]} Banner Expired" 
    fi