我正在尝试检查 linux 上的 shell 脚本,如果STR
包含“仅字母”或包含“仅数字”则退出。如果STR
同时包含数字和字母,它应该通过。并且不包含特殊字符。
我正在尝试这样的事情,但它只能部分起作用。
#!/bin/sh
STR=$1
if [[ ! $STR =~ ^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$ ]]; then
echo "The input must contain both digits and alphabets like abc123"
exit 1
fi
echo "Success"
exit 0
检查部分有效,即如果STR
仅包含数字。STR
但如果包含所有字母则不起作用。我只想在同时包含字母和数字(如or )exit 1
时不执行。STR
abc123
ABC123
如果STR
包含,则检查失败abc
。
STR
当仅包含abc
以及仅STR
包含时,如何使检查工作123
?
您不需要在这里使用复杂的正则表达式。你有两个条件,所以使用两个测试:
您还谈到了“特殊字符”,但没有具体说明这些是什么。假设您的意思是与 匹配的字符
[[:punct:]]
,并且您不希望这些字符出现在字符串中,您可以使用[[:punct:]]
将匹配字符串中的任何一个字符正则表达式
^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$
不会单独检查数字,因为[:alnum:]
也匹配字母。[:alpha:]
应该是 的子集[:alnum:]
,因此该模式匹配任何全为字母数字且至少包含一个字母的字符串。(假设通常的贪心匹配,如果输入是
abcd
,那么abc
将被匹配[[:alnum:]]*
,最终d
将被匹配,[[:alpha:]]
最后一个[[:alnum:]]*
不会(不需要)匹配任何东西。)如果您想检查字符串是否至少包含一个字母和一个数字,将其分为两个测试更容易,即测试
[[:alpha:]]
and[[:digit:]]
:如果您还想拒绝包含其他任何内容(如标点符号)的字符串,请添加一个检查:
要查找失败的案例,请在开始时用 a 反转整个测试
!
(if ! [[ ...
)。(要用一个正则表达式来做到这一点,你可以使用这样
^([[:alnum:]]*[[:alpha:]][[:alnum:]]*[[:digit:]][[:alnum:]]*|[[:alnum:]]*[[:digit:]][[:alnum:]]*[[:alpha:]][[:alnum:]]*)$
的东西:但这有点可怕)试着让它更简单。把问题一分为二: