我想检查 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% 确定export
或grep
使用前缀 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”的原因,因为匹配的字符为零。