Bash需要测试字母数字字符串

时间:2013-08-04 10:01:23

标签: regex string bash if-statement alphanumeric

尝试验证字符串中只包含小写,大写或数字。

if ! [[ "$TITLE" =~ ^[a-zA-Z0-9]+$ ]]; then echo "INVALID"; fi

思想?

*更新*

变量TITLE目前只有大写文本,因此它应该通过,不应输出任何内容。但是,如果我向TITLE添加一个特殊字符,IF语句应该捕获它并回显INVALID。目前它不起作用。它总是回声无效。我认为这是因为我的正则表达式是错误的。我认为我写它的方式,它寻找一个包含所有三个标题的标题。

Bash 4.2.25

这个想法是,用户应该能够添加任何标题,只要它只包含大写,小写或数字。所有其他角色都应该失败。

*更新*

如果TITLE = ThisIsAValidTitle,则回声无效。

如果TITLE = ThisIs @@@@@@@ InvalidTitle,它也无效。

*解决方案*

很奇怪,当我把它简化到这个时,它就开始工作了:

TEST="Valid0"
if ! [[ "$TEST" =~ [^a-zA-Z0-9] ]]; then
  echo "VALID"
else
  echo "INVALID"
fi

* REAL SOLUTION *

我的变量中有空格...... DUH

对不起麻烦的人......

*最终解决方案*

这说明了标题中的空格

if ! [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then
  echo "VALID"
else
  echo "INVALID"
fi

3 个答案:

答案 0 :(得分:12)

我会颠倒逻辑。测试无效字符并在至少存在一个警告时回显警告:

if [[ "$TITLE" =~ [^a-zA-Z0-9] ]]; then
  echo "INVALID"
fi

话虽如此,您的原始支票对我有用,因此您可能需要提供更多上下文(即脚本的更大部分)。

答案 1 :(得分:0)

指定的答案是错误的。因为它不会检查字符串的结尾。它也被倒置了。如条件所示:"如果字符串的开头是有效字符,则echo无效"

[[ $TITLE =~ ^[a-zA-Z0-9_-]{3,20}$ ]] && ret="VALID" || ret="INVALID"

echo $ret

答案 2 :(得分:0)

为什么我们不能使用alnum

[[ 'mystring123' =~ [:alnum:] ]] && echo "ok" || echo "no"