如何验证 shell 脚本变量是否是字母数字?

如何验证 shell 脚本变量是否是字母数字?

我想检查 shell 脚本变量是否仅包含字母和数字字符:

str1="3dr>f43fe*" --> Not good
str2="RFEfew3"    --> Good

我该怎么做?

答案1

为了阐述 Ángel 的评论,使用以下内容进行工作grep

echo "$str" | grep -q '^[[:alnum:]]*$' && echo Good
  • 使用的正则表达式匹配任何由任意数量^的字母数字字符组成的字符串,此处通过较新的定义$*[[:alnum:]]字符类语法

旧版本grep可能尚不支持那些双边括号正则表达式,在这种情况下您可以使用以下替代方法:

echo "$str" | grep -q '^[A-Za-z0-9]*$' && echo Good
  • 这里通过字符范围匹配字母数字字符,通常在尤其是较旧的工具/版本中仍然得到更好的支持。
  • 注意:虽然在大多数情况下字符范围和字符类定义会导致相同的结果,但某些语言的特殊字符会有所不同。例如,法语ç æ œ或波兰语ą通常不匹配[a-z],但如果设置了相关的系统区域设置(语言),则可能匹配或不匹配[[:alnum:]]。要 100% 确定exportgrep使用前缀 egLC_ALL=C.UTF-8以在所有系统上获得一致的结果。非常感谢 Kamil Maciorowski 提供这个重要提示。

在上述两种情况下,空变量也匹配。如果至少应有一个字符,请使用:

echo "$str" | grep -qE '^[[:alnum:]]+$' && echo Good
  • 代表+“至少一次”,*而 也允许“零次”。但由于 是+扩展正则表达式语法的一部分,因此大多数grep构建都需要该-E标志。

-q选项会grep静默返回退出代码,因此您可以使用 if-then-else&&和/或||根据结果继续。


上述解决方案假设$str是单行变量。如果它包含多行,则只需匹配一行,而其他行可以包含其他字符而不会影响grep退出代码。

如果要排除多行变量,bash条件允许这样做:

[[ $str =~ ^[[:alnum:]]+$ ]] && echo Good

在所有 POSIX shell 上(即sh),expr可以使用:

expr match "$str" "^[[:alnum:]]\+$" > /dev/null && echo Good
  • 在 中expr,要使用扩展正则表达式语法+,需要使用前导反斜杠 进行转义\+。基本正则表达式语法(如*)可以处理这种情况。但^[[:alnum:]]*$由于某种原因,它与空字符串不匹配,不确定为什么。
  • 我添加了> /dev/null将标准输出 (STDOUT) 重定向到 Nirvana /dev/null,因为expr否则会打印匹配字符的数量,0如果不匹配则打印。这可能是空字符串永远不会返回“true”的原因,因为匹配的字符为零。

相关内容