Bash 总是将 Regex 评估为真

Yan*_*hon 5 bash scripts regex

在脚本中,有这些行

#!/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
Run Code Online (Sandbox Code Playgroud)

问题是,无论$SCREEN_NAME设置为什么值,脚本总是以该消息退出。我试过用 Bash 阅读正则表达式,我看不出有什么问题。我错过了什么?

更新

在评论和回答之后,我回应了$SCREEN_NAME,似乎没有任何问题......直到我做到了

echo "*$SCREEN_NAME*"
Run Code Online (Sandbox Code Playgroud)

并看到第二个星号被放在了一个新行上。这是如何$SCREEN_NAME设置的:

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties  | cut -f2 -d'=')
Run Code Online (Sandbox Code Playgroud)

该值是从 INI 之类的配置文件中读取的。有趣的一行是

server_screen_title=Test-Server
Run Code Online (Sandbox Code Playgroud)

我相信该值包含终止字符\n。因此测试失败。我已经阅读了 man for cut,但我不知道如何解决这个问题,也不知道我是否正确。

kos*_*kos 3

我在这方面太快了,你的测试有效。我怀疑您以某种方式在全局或之前在脚本中将其设置$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的输出连接到trbefore cut

SCREEN_NAME=$(grep -i 'server_screen_title' server.properties | tr -d '\r' | cut -f2 -d'=')
Run Code Online (Sandbox Code Playgroud)