If子句在Unix中无法按预期工作

时间:2019-05-06 10:25:08

标签: shell if-statement unix

我正在努力使用Unix脚本来发送来自success.log和failure.log的邮件。

使用我当前的脚本和我所做的更改,要么是成功邮件,要么是失败邮件 DB_Success_log具有成功处理的所有数据库。 DB_Failure_log具有所有失败的数据库。下面只是我的脚本的骨架,而不是确切的脚本。

DB_Success_log=path/DB_success.log
DB_Failure_log=path/DB_failure.log
mail_content=path/mail_content.mail


if [-f "$DB_Success_log" ] ; then
echo " From :$from
To : $to
cc : $cc
Subject : $subject

Below Db got success  >$mail_content
cat $DB_Success >>$mail_content

if [-f "$DB_failure_log" ] ; then
echo " From :$from
To : $to
cc : $cc
Subject : $subject

Below DB got failed  >$mail_content
cat $DB_Failure >>$mail_content

cat $mail_content |sendmail -t

在以上两个中,只有一个正在运行。如果10个数据库中有5个失败,则5个成功,那么列表中只会出现失败的邮件或成功。我试图更改If子句,但无济于事。

1 个答案:

答案 0 :(得分:0)

Shell脚本要求您特别注意空格。

[命令是常规命令(以及内置的shell);通常您会找到可执行文件/bin/[/usr/bin/[(以及/bin/test/usr/bin/test。因此,shell仅在正确拼写命令时才能找到该命令。 ,当命令名称拼写为[时,它要求其最后一个参数为](仅)。

您有:

if [-f "$DB_Success_log" ] ; then

您的计算机上很可能没有命令/bin/[-f;您应该收到有关“找不到命令[-f”的shell错误消息。您需要:

if [ -f "$DB_Success_log" ] ; then

我几乎自动删除了分号前的空格(无论如何,外壳程序都会在执行[命令之前删除分号)。它没有害处,但不是必需的。

您在"$DB_failure_log"上遇到了同样的问题-让我想知道变量名中的大小写不一致,但这主要是您的问题。

对于echo " From :$from开始的命令,您似乎还缺少正确的右引号。大概应该出现在> $mail_content行之前。您还需要检查是否缺少第一个sendmail命令,是否还有其他杂项(fi缺失两次?),您也应该注意。