如何检查变量是否仅包含字母

时间:2018-07-15 15:55:18

标签: bash

我尝试检查以下情况:

#!/bin/bash

line="abc"

if [[ "${line}" != [a-z] ]]; then
   echo INVALID
fi

然后我得到INVALID作为输出。但是为什么呢?
无需检查$line是否仅包含[a-z]范围内的字符?

5 个答案:

答案 0 :(得分:4)

使用正则表达式匹配运算符=~

#!/bin/bash

line="abc"

if [[ "${line}" =~ [^a-zA-Z] ]]; then
   echo INVALID
fi

答案 1 :(得分:2)

在任何Bourne外壳中均可使用,并且不会浪费管道/叉子:

proprietary: "John Doe"(a document)

things(collection of John's things documents)

thingsSharedWithOthers(collection of John's things being shared with others):
[thingId]:
    {who: "first@test.com", when:timestamp}
    {who: "another@test.com", when:timestamp}

then set thingsSharedWithOthers

firebase.firestore()
.collection('thingsSharedWithOthers')
.set(
{ [thingId]:{ who: "third@test.com", when: new Date() } },
{ merge: true }
)

如果还要允许使用大写字母,请使用case $var in ("") echo "empty";; (*[!a-z]*) echo "contains a non-alphabetic";; (*) echo "just alphabetics";; esac

答案 2 :(得分:1)

能否请您尝试以下操作,如果有帮助,请告诉我。

line="abc"
if  echo "$line" | grep -i -q '^[a-z]*$'
then
        echo "MATCHED."
else
        echo "NOT-MATCHED."
fi

答案 3 :(得分:1)

模式匹配项固定在字符串的开头和结尾,因此您的代码检查$line是否不是单个小写字符。您要匹配任意小写字符的序列,可以使用扩展模式进行匹配:

if [[ $line != @([a-z]) ]]; then

或使用正则表达式运算符:

if ! [[ $line =~ ^[a-z]+$ ]]; then  # there is no negative regex operator like Perl's !~

答案 4 :(得分:0)

为什么?由于!=的意思是“不相等”,因此。您告诉bash将abc[a-z]进行比较。他们不平等。

尝试echo $line | grep -i -q -x '[a-z]*'

标志-i使grep不区分大小写。 标志-x表示匹配整行。 标志-q表示不向stdout打印任何内容,只需返回1或0。