Bash 如何检查变量是否仅包含字母
我试图检查以下情况:Bash 如何检查变量是否仅包含字母,bash,Bash,我试图检查以下情况: #!/bin/bash line="abc" if [[ "${line}" != [a-z] ]]; then echo INVALID fi 我得到了无效的作为输出。但是为什么呢? 如果$line仅包含[a-z]范围内的字符,则不需要进行检查。使用正则表达式匹配运算符=~: #!/bin/bash line="abc" if [[ "${line}" =~ [^a-zA-Z] ]]; then echo INVALID fi 为什么??因为=表示
#!/bin/bash
line="abc"
if [[ "${line}" != [a-z] ]]; then
echo INVALID
fi
我得到了无效的作为输出。但是为什么呢?
如果$line
仅包含[a-z]范围内的字符,则不需要进行检查。使用正则表达式匹配运算符=~
:
#!/bin/bash
line="abc"
if [[ "${line}" =~ [^a-zA-Z] ]]; then
echo INVALID
fi
为什么??因为=代码>表示“不相等”,这就是为什么。您告诉bash将abc
与[a-z]
进行比较。他们不平等
尝试echo$line | grep-i-q-x'[a-z]*'
标志-i使grep不区分大小写。
标志-x表示匹配整条线。
标志-q表示不向标准输出任何内容,只需返回1或0。请尝试以下内容,并让我知道这是否有助于您
line="abc"
if echo "$line" | grep -i -q '^[a-z]*$'
then
echo "MATCHED."
else
echo "NOT-MATCHED."
fi
在任何Bourne shell中工作,无管道/叉:
case $var in
("") echo "empty";;
(*[!a-z]*) echo "contains a non-alphabetic";;
(*) echo "just alphabetics";;
esac
如果希望同时允许大写,请使用[!a-zA-Z]
。模式匹配锚定到字符串的开头和结尾,因此代码将检查$line
是否不是单个小写字符。要匹配任意小写字符序列,可以使用扩展模式:
if [[ $line != @([a-z]) ]]; then
或使用正则表达式运算符:
if ! [[ $line =~ ^[a-z]+$ ]]; then # there is no negative regex operator like Perl's !~
编辑以接受大写字母并拒绝像abc123这样的行。请注意,=~
是一种不可移植的bashism。您不需要在正则表达式模式中指定大小写范围,因为您已经指定匹配必须与-i
标志不区分大小写。@CJK,当然很酷,谢谢您告诉我,现在编辑,干杯。没有引号,bash尝试用[a-z]*
展开文件名。