我有这个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
答案 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
指向更多信息的指针:
grep
and sed
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共享,那么改变逻辑可能会使您进一步简化最终脚本。