我有一个 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 [[ ... ]]
。
但是,我假设您在该测试中想要做的是查看$message
contains是否$checkword
作为子字符串。这也可以通过
[[ "$message" == *"$checkword"* ]] && sendY
或与case ... esac
:
case $message in
*"$checkword"*) sendY
esac
这样您就不必担心$checkword
包含正则表达式中可能特殊的字符。
您还需要$message
在 中加双引号echo $message
,否则如果$message
包含文件名通配符(例如*
.
有关的:
- Bash - 如果语法混乱
- Bash 运算符 [[ vs [ vs ( vs ((?
- 什么时候需要双引号?
- 为什么 printf 比 echo 更好?
printf '%s\n' "$message"
(因为它比echo "$message"
用户提供的数据更好用) - https://www.shellcheck.net/(这会发现这些问题,可能还有其他问题,比如缺少正确的
#!
-line)
您还可以使用它来代替脚本中的第一个操作:
case $message in
*[!\ ]*) # contains non-space
message='``` '"$message"' ```' ;;
*) # contains nothing or only spaces
message=
esac
在这两个地方使用case ... esac
将使您的脚本(至少是您所显示的部分)可移植到任何sh
类似的 shell。