Bash 始终将 Regex 评估为 true

Bash 始终将 Regex 评估为 true

在剧本里有这样几行

#!/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'=')

相关内容