我尝试检查以下情况:
#!/bin/bash
line="abc"
if [[ "${line}" != [a-z] ]]; then
echo INVALID
fi
然后我得到INVALID
作为输出。但是为什么呢?
无需检查$line
是否仅包含[a-z]范围内的字符?
答案 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。