将字符串与正则表达式进行比较

将字符串与正则表达式进行比较

我想检查主机名以确保它们遵循Bash Shell.

假设主机名是ab-cde-01

wolf@linux:~$ h='ab-cde-01'
wolf@linux:~$ echo $h
ab-cde-01
wolf@linux:~$ 

我从构建 if else 循环开始,它工作得很好。

wolf@linux:~$ if [ $h = 'ab-cde-01' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

但是,当我尝试使用正则表达式将数字替换为 [0-9] 时,我得到的名称无效。

wolf@linux:~$ if [ $h = 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 

更新1:=~运算符

=~按照建议使用运算符...

wolf@linux:~$ if [ $h =~ 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
bash: [: =~: binary operator expected
ab-cde-01 is an INVALID name
wolf@linux:~$ 

更新2:双括号

wolf@linux:~$ if [[ $h =~ 'ab-cde-0[0-9]' ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 
  1. 这段代码有什么问题?
  2. 如何修复它?
  3. 这是根据特定标准检查主机名的正确/最有效的方法吗?

更新3:实际答案也供我自己参考

wolf@linux:~$ if [[ $h =~ ab-cde-0[0-9] ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

得到教训

  1. 使用双括号代替单括号
  2. 正则表达式中没有引号

答案1

您的最后一次尝试是最接近的,但仍然存在一些问题。

从根本上来说,它不起作用,因为您引用了正则表达式。它需要是这样的:

MATCH='ab-cde-0[0-9]'
if [[ "$h" =~ $MATCH ]];then

但那里仍然存在一个问题,因为您还没有锚定正则表达式(意味着它可以在给定字符串的中间匹配),所以上面的内容仍然会传递给h=foo-ab-cde07bar.

锚定是这样完成的:

MATCH='^ab-cde-0[0-9]$'
if [[ "$h" =~ $MATCH ]];then

但在这个有限的示例中,您甚至不需要使用正则表达式,您可以使用全局匹配来代替。这应该适用于您所呈现的内容:

MATCH='ab-cde-0[0-9]'
if [[ "$h" = $MATCH ]];then

$h注意:我在所有示例中都引用了该字符串,因为这是一个很好的做法。

编辑:我现在根据建议将匹配器定义为变量伊尔卡丘

相关内容