![Bash 始终将 Regex 评估为 true](https://linux22.com/image/1125966/Bash%20%E5%A7%8B%E7%BB%88%E5%B0%86%20Regex%20%E8%AF%84%E4%BC%B0%E4%B8%BA%20true.png)
在剧本里有这样几行
#!/bin/bash
...
if ! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]; then
echo "The Server title contains invalid symbole. Only a-z A-Z 0-9 - _ . are allowed"
exit 1;
fi
问题是,无论$SCREEN_NAME
设置为何值,脚本总是会退出并显示该消息。我尝试使用 Bash 读取正则表达式,但没有发现任何问题。我遗漏了什么?
更新
根据评论和答案,我附和了一下$SCREEN_NAME
,似乎没有什么问题……直到我这样做
echo "*$SCREEN_NAME*"
$SCREEN_NAME
并看到第二个星号被放在了新行上。设置方法如下:
SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | cut -f2 -d'=')
该值是从 INI 类配置文件中读取的。有趣的一行是
server_screen_title=Test-Server
并且我相信该值包含终止字符\n
。因此测试失败。我已阅读 man 的说明cut
,但不确定如何修复此问题,也不知道我是否正确。
答案1
我太快了,你的测试成功了。我怀疑你以某种方式$SCREEN_NAME
在全局或之前在脚本中设置为包含非法字符的字符串。
^[a-zA-Z0-9_.-]+$
匹配仅包含允许字符的非 NULL 字符串,因此如果$SCREEN_NAME
是仅包含允许字符的非 NULL 字符串,$SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$
则 的值为 0。
!
反转其值,因此如果$SCREEN_NAME
是仅包含允许字符的非 NULL 字符串,! [[ $SCREEN_NAME =~ ^[a-zA-Z0-9_.-]+$ ]]
则 的值为 1。
所以状态还可以。
运行echo $SCREEN_NAME
脚本bash
并检查实际输出是否与预期相符。
编辑:要删除尾随的回车符,一种解决方案是通过管道grep
将 的输出传输到tr
之前cut
:
SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')