Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何检查变量是否仅包含字母_Bash - Fatal编程技术网

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]*
展开文件名。