Bash 仅在命令 returns 输出时发送邮件的脚本

Bash script to send mail only if command returns output

我正在尝试编写一个 bash 脚本,在某些文件被修改时提醒我。 所以我写了这个:

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)
if [[ -n $? ]]
then
    mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi

但即使没有找到文件,它也会发送一封邮件。

我错过了什么?

/usr/bin/find 根据其参数找到某个文件时,会发生两个事件:return 状态被设置为变量 $? 中的某个值,并且一个字符串被输出到变量 $MYOUT,根据您的代码。

从你的问题“...仅当命令 returns 输出时才发送邮件的脚本”,我可以推断你想使用第二种方法来决定发送邮件。

在那种情况下,您必须如下更改测试条件,检查 $MYOUT 的值而不是 $? 的值,将测试放在单个方括号中:

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)
if [ -n "$MYOUT" ]
then
    mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi

另一个选项是检查变量赋值的退出状态。

if MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1); then
  mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT"
fi

或者,检查退出状态,如

MYOUT=$(/usr/bin/find /home/public_html/ \( -iname "*.js" -o -iname "*.tpl" -o -iname "*.php" \) -mtime -1)

case $? in
   0) mail -s "Hack attempt" my_mail@gmail.com <<<"$MYOUT";;
esac