我想检查主机名以确保它们遵循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:~$
- 这段代码有什么问题?
- 如何修复它?
- 这是根据特定标准检查主机名的正确/最有效的方法吗?
更新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
您的最后一次尝试是最接近的,但仍然存在一些问题。
从根本上来说,它不起作用,因为您引用了正则表达式。它需要是这样的:
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
注意:我在所有示例中都引用了该字符串,因为这是一个很好的做法。
编辑:我现在根据建议将匹配器定义为变量伊尔卡丘