我在多台机器上运行以下脚本,它在几台机器上运行良好,但现在在其他机器上运行,并给出错误。
下面给出了脚本和错误。
脚本:
host="$(/bin/hostname)";
qSize="$(/usr/sbin/exim -bpc)";
qLimit="100";
sTo="[email protected]";
sFr="root@"$hostname;
if [ $qSize -ge $qLimit ]; then
echo "There are "$qSize "emails in the mail queue" | sed 's/^/To: '"$sTo"'\nSubject: *ALERT* - Mail queue o
n '"$host"' exceeds limit\nFrom: '"$sFr"'\n\n/' | sendmail -t
else
echo -e "There are "$qSize "emails in the mail queue"
fi
错误!!
sed: -e expression #1, char 79: unterminated `s' command
有谁知道错误可能是什么?
答案1
你的代码:
echo "There are "$qSize "emails in the mail queue" | sed 's/^/To: '"$sTo"'\nSubject: *ALERT* - Mail queue o
n '"$host"' exceeds limit\nFrom: '"$sFr"'\n\n/' | sendmail -t
读起来很痛苦。更糟糕的是,即使你重新格式化它以使其可读,无用的使用也是sed
奇怪的 - 完全是错误的。您用于sed
在 echo 语句的输出之前插入电子邮件标题。这完全没有意义。
简而言之,你不需要sed
在这里使用,也不应该sed
在这里使用。它只会增加额外的复杂性和出现错误的机会。
做这样的事情:
sendmail -t <<EOF
From: $sFr
To: $sTo
Subject: *ALERT* - Mail queue on '$host' exceeds limit
There are $qSize emails in the mail queue
EOF
或者像这样:
subject="*ALERT* - Mail queue on '$host' exceeds limit"
message="There are $qSize emails in the mail queue"
echo "$message" | sendmail -f "$sFR" -s "$subject" "$sTO"
甚至像这样:
{
echo "From: $sFr"
echo "To: $sTo"
echo "Subject: *ALERT* - Mail queue on '$host' exceeds limit"
echo
echo "There are $qSize emails in the mail queue"
} | sendmail -t
即使这样也更好:
echo "From: $sFr
To: $sTo
Subject: *ALERT* - Mail queue on '$host' exceeds limit
There are $qSize emails in the mail queue" | sendmail -t
简而言之,几乎任何其他将多行文本通过管道传输到另一个程序(sendmail
在本例中为 )的方式都比您正在执行的方式更好。
答案2
你有两条线
echo "There are "$qSize "emails in the mail queue" | sed 's/^/To: '"$sTo"'\nSubject: *ALERT* - Mail queue o
n '"$host"' exceeds limit\nFrom: '"$sFr"'\n\n/' | sendmail -t
应该是单行
echo "There are "$qSize "emails in the mail queue" | sed 's/^/To: '"$sTo"'\nSubject: *ALERT* - Mail queue on '"$host"' exceeds limit\nFrom: '"$sFr"'\n\n/' | sendmail -t
即该错误可能是由您将其复制/粘贴到本机的方式引起的。
问题出在第 79 列(80 列显示?)这一事实有点证实了这一点。