2009-08-04 30 views
6

我正在向现有脚本添加一项功能,以允许用户配置Linux系统的主机名。是我在强制执行规则如下:如何确保Bash字符串是字母数字,没有下划线?

  • 必须长
  • 不能同时启动或用连字符
  • 只能包含字母数字字符和连字符结束2到63个字符之间;所有其它字符不允许(包括下划线,这意味着我不能使用\ W正则表达式符号)

我已经解决了该列表中的前两个,但我无法找出如何检查一个bash字符串是否只包含字母,数字和连字符。我想我可以用一个正则表达式来做这件事,但我很难弄清楚(我过去的一小时在网上搜索和阅读手册页)。

我可以使用sed,grep或任何其他标准工具,但不能使用Perl或Python。

回答

14

好像这应该做到这一点:

^[a-zA-Z0-9][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]$ 

匹配任何一个字母数字字符,然后匹配高达61个字母数字字符(包括连字符),则匹配任何一个字母数字字符。最小字符串长度是2,最大值是63.它不适用于Unicode。如果你需要它来处理Unicode,你需要添加不同的字符类来代替a-zA-Z0-9,但是原理将是相同的。

我相信正确的grep表达将与Unicode的工作是:

^[[:alnum:]][-[:alnum:]]{0,61}[[:alnum:]]$ 
+1

如何使用第二个表达式使用grep办呢?我正在寻找手册页中的开关,但没有成功:我回应一个应该匹配的字符串,并且没有输出。 – 2009-08-04 19:42:36

+0

@Montecristo:'grep -E'或'egrep' – Welbog 2009-08-04 19:51:35

+0

我试过了:echo 1asdas * _- | grep -E'^ [[:alnum:]] [ - [:alnum:]] {0,61} [[:alnum:]] $',没有输出(也没有单引号),大声笑我应该问一个问题我认为...:P – 2009-08-04 20:07:27

1

这是你需要的最后一个:sed -e 's/[^[:alnum:]|-]//g'

2

这是一个bash脚本测试第一个参数是否含有只有字母数字或连字符。它的“管道” $ 1的内容到grep的:

#!/bin/bash 
if grep '^[-0-9a-zA-Z]*$' <<<$1 ; 
    then echo ok; 
    else echo ko; 
fi 
+0

为什么这里的^代表消极而不是第一次出现? – Stallman 2015-11-05 13:50:57

+0

它意味着“行的开始”,所以它和'$'之间的每个字符都必须符合这个模式。 – 2015-11-05 15:02:48

0

你可以只用bash的

string="-sdfsf" 
length=${#string} 
if [ $length -lt 2 -o $length -gt 63 ] ;then 
    echo "length invalid" 
    exit 
fi 
case $string in 
    -*) echo "not ok : start with hyphen";exit ;;  
    *-) echo "not ok : end with hyphen";exit ;; 
    *[^a-zA-Z0-9-]*) echo "not ok : special character";exit;; 
esac 
相关问题