邮件-s等待bash脚本中的CTRL + D

时间:2019-01-09 11:37:16

标签: linux bash

我有这个bash脚本来检查是否安装了nfs共享,但是挂起它等待我运行该邮件时按下CTRL + D-我该如何解决?

#!/bin/bash

#set -x
mailto1=abc@test.com
#get the netapp mount point - /mnt/Netapp_NFS_Backup:
netapp_nfs_share=$(cat /etc/fstab | awk '$1 !~/#|^$|swap/ {print $2}' | sed '1,7d')

##search through "df -hPT" for the netapp mount point to see if there: 
for FS in ${netapp_nfs_share)
do
    df -hPT | grep -wq ${FS}

    if [ $? -eq 0 ]
    then
        mail -s "Netapp NFS Share is mounted" $mailto1
        #echo "Netapp NFS Share is mounted
    else
        echo "Netapp NFS share is not mounted"
    fi
done

2 个答案:

答案 0 :(得分:3)

发送时,mail命令从stdin流中获取其消息正文。您可以使用管道发送空行作为邮件正文:

echo | mail -s "Netapp NFS Share is mounted" "$mailto1"

答案 1 :(得分:3)

这是每个读取标准输入的命令将执行的操作,如果您没有为它提供来自其他来源的标准输入。通常的解决方案是将其重定向为从/dev/null读取。

mail -s "Netapp NFS Share is mounted" "$mailto1"</dev/null

但是,您可能还希望修复脚本中的其他反模式。请参阅此重构版本中的嵌入式注释。

#!/bin/bash

mailto1=abc@test.com
# avoid useless cat; refactor sed into Awk
# pipe to while read instead of using a for loop
awk '$1 !~/#|^$|swap/ && ++c > 7 {print $2}' /etc/fstab |

while read -r FS; do
    # avoid useless use of if [ $? -eq 0 ]
    # quote variable
    if df -hPT | grep -wq "${FS}"; then
        # add redirect; quote variable
        mail -s "Netapp NFS Share is mounted" "$mailto1" </dev/null
    else
        # print diagnostics to stderr; include script name
        echo "$0: Netapp NFS share is not mounted" >&2
    fi
done

指向更多信息的指针:

http://shellcheck.net/处的脚本验证工具可以诊断其中的一些但不是全部错误和反模式。

...作为进一步的改进,也许只运行一次df并将其传递给Awk:

if  df -hPT |
    awk 'BEGIN { r = 1 }
        # NR is equal to FNR while we are processing the first input file, i.e. stdin from df
        NR==FNR { a[++n] = $0; next }
        $1 !~/#|^$|swap/ && ++c > 7 {
            for (i=1; i<=n; ++i)
                if ($2 ~ a[i]) {
                    r=0; exit r } }
        END { exit r }' - /etc/fstab
then
    mail -s "Netapp NFS Share is mounted" abc@test.com </dev/null
else
    echo "$0: Netapp NFS share is not mounted" >&2
fi

这也恰好说明了if的目的实际上只是为了检查作为参数运行的管道的退出状态。

如果您可以确定只有一个挂载的NFS共享,那么改变逻辑可能会使您进一步简化最终脚本。