用于检测空消息字符串的 Bash 脚本。得到:太多的争论

用于检测空消息字符串的 Bash 脚本。得到:太多的争论

我有一个 bash 脚本,可以将另一个应用程序的输出通过管道输入到下面的脚本中。但我认为我测试消息是否为空的逻辑不正确。如果它是空的,我希望它什么都不做,但如果它在字符串中检测到单词“错误”,它应该运行另一个函数。

我的逻辑做错了什么?

我在第三行到最后一行收到了太多参数,很可能是由于消息为空。

message=$( cat )

if [ -n "${message// /}" ]; then
  #execute if the the variable is not empty and contains non space characters
  message="\`\`\` ${message} \`\`\`"
else
  #execute if the variable is empty or contains only spaces
  message=""
fi

sendX() {
.....
}

if  [ -z "$message" ]; then
        echo "Please pipe a message to me!"
else
        sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then  <---- Error: too many arguments
 sendY
fi

答案1

[ ... ]由于不理解=~运算符(用于bash正则表达式匹配),因此您收到“参数太多”错误。由于[ ... ]不理解运算符,因此将其视为字符串。然后你[ ... ]在里面有三个字符串,它们不满足正确测试的语义要求,这就是bash此时出错的原因。

在 中bash,您将使用=~inside of [[ ... ]]

但是,我假设您在该测试中想要做的是查看$messagecontains是否$checkword作为子字符串。这也可以通过

[[ "$message" == *"$checkword"* ]] && sendY

或与case ... esac

case $message in
    *"$checkword"*) sendY
esac

这样您就不必担心$checkword包含正则表达式中可能特殊的字符。

您还需要$message在 中加双引号echo $message,否则如果$message包含文件名通配符(例如*.

有关的:


您还可以使用它来代替脚本中的第一个操作:

case $message in
    *[!\ ]*) # contains non-space
        message='``` '"$message"' ```' ;;
    *)       # contains nothing or only spaces
        message=
esac

在这两个地方使用case ... esac将使您的脚本(至少是您所显示的部分)可移植到任何sh类似的 shell。

相关内容