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,但我不知道如何解决这个问题,也不知道我是否正确。
我在这方面太快了,你的测试有效。我怀疑您以某种方式在全局或之前在脚本中将其设置$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)