bash使用正则表达式验证用户名

时间:2016-07-17 23:48:31

标签: regex bash validation username

来自useradd手册页的

我应该能够验证文件中的归档红色是否是有效的用户名:

if [ $1 =~ [a-z_][a-z0-9_-]*[$]? ]; then

不允许使用空格,但未检测到,第一个字符仅限于a-z和下划线但是再次检测不到,Fedora的限制为16个字符。 所以修改它是这样的:

GroupeEtUsagerValide() {
    if [ ${#1} -gt 16 ];then
        return 1
        elif [[ $1 =~ ^[[:lower:]_][[:lower:][:digit:]_-]{2,15} ]]; then
            return 0
        else
            return 1
    fi 
}

检测到空白区域,但现在已经没有了,我必须更改某些内容并找不到它 这是一个函数$ 1是从文件中读取的值

2 个答案:

答案 0 :(得分:2)

一些注意事项:

  • 正则表达式匹配(使用ERE语法)仅在[[ ]]中提供,而不是[ ](在您的第一个代码示例中使用)。
  • 函数的默认返回值是其中最后一个命令的返回值。因此if完全不需要。
  • 如果你没有明确地锚定你的正则表达式,最后在{strong>和 ^开头$,它就不会被锚定在所有。您当前的代码最后没有锚点,因此即使这些字符后跟空格,它也会接受至少包含三个有效字符的任何内容。
isValidUsername() {
  local re='^[[:lower:]_][[:lower:][:digit:]_-]{2,15}$'
  (( ${#1} > 16 )) && return 1
  [[ $1 =~ $re ]] # return value of this comparison is used for the function
}

要使用它:

testValidUsername() {
  if isValidUsername "$1"; then
    echo "$1 is a valid username"
  else
    echo "$1 is not a valid username"
  fi
}

testValidUsername abcdefg
testValidUsername 1234567
testValidUsername a123456
testValidUsername 012345678901234567890

...和输出,如预期的那样:

abcdefg is a valid username
1234567 is not a valid username
a123456 is a valid username
012345678901234567890 is not a valid username

答案 1 :(得分:0)

我在开始时非常接近,手册页是正确的,我只是错过了锚点。

if [[ $usager =~ ^[[:lower:]_][[:lower:][:digit:]_-]*[$]?$ ]]; then