我有一个 bash 脚本,我可以在其中将另一个应用程序的输出通过管道输入到下面的脚本中。但我认为我有一个不正确的逻辑来测试消息是否为空。如果它是空的,我希望它什么也不做,但是如果它在字符串中检测到单词“error”,它应该运行另一个函数。
我在逻辑上做错了什么?
我在第三行到最后一行的参数太多,很可能是由于消息为空。
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
[ ... ]
由于不理解=~
运算符(用于bash
正则表达式匹配),因此您收到“参数过多”错误。由于[ ... ]
不理解运算符,因此将其视为字符串。然后,您在[ ... ]
其中包含三个字符串,它们不满足正确测试的语义要求,这就是bash
此时出现错误的原因。在
bash
中,您将使用=~
inside of[[ ... ]]
。但是,我假设您想在该测试中做的是查看是否
$message
包含$checkword
作为子字符串。这也可以用或与
case ... esac
:这样您就不必担心
$checkword
包含可能在正则表达式中特殊的字符。您还需要在 中加双引号
$message
,echo $message
否则如果$message
包含文件名通配符(如*
.有关的:
printf '%s\n' "$message"
(因为它比echo "$message"
用户提供的数据更好用)#!
-line)您也可以使用它来代替脚本中的第一个操作:
在这两个地方使用
case ... esac
将使您的脚本(至少是您显示的位)可移植到任何sh
类似的外壳。