我有一个非常简单的代码,如下所示:
txt="hard==2.3.3 soft==2.1.1 weak rep=2.1"
if [[ $txt =~ ([^\=]\=\=[^\=])* ]]; then
echo "Good"
else
echo "Bad"
# Output is "Bad"
我希望if
语句仅在==
时才为真,所以如果有独奏=
或者有===
则为假。所以基本上,如果有一个=
,就必须在第二个之后。如果没有=
(与weak
一样),那就没关系了。
我的代码存在的问题是,只要txt中至少有一个==
,if
就会成立。有没有办法确保每次出现都有第二个=
?感谢
答案 0 :(得分:1)
听起来我想要拒绝单等于或等于或等于3的情况。您当前的if语句接受双等号。
所以你应该这样做:
txt='hard==2.3.3 soft==2.1.1 weak rep=2.1';
function eq {
txt="$1";
if [[ ! $txt =~ (^|[^=])=([^=]|$)|={3,} ]]; then
echo "Good"
else
echo "Bad"
fi;
} ## end eq()
广泛的测试:
## test one case at a time
eq 'x '; ## Good
eq '= '; ## Bad
eq 'x= '; ## Bad
eq '=x '; ## Bad
eq 'x=x '; ## Bad
eq '== '; ## Good
eq 'x== '; ## Good
eq '==x '; ## Good
eq 'x==x '; ## Good
eq '=== '; ## Bad
eq 'x=== '; ## Bad
eq '===x '; ## Bad
eq 'x===x'; ## Bad
## test all pairwise combinations
eq 'x = '; ## Bad
eq 'x x= '; ## Bad
eq 'x =x '; ## Bad
eq 'x x=x '; ## Bad
eq 'x == '; ## Good
eq 'x x== '; ## Good
eq 'x ==x '; ## Good
eq 'x x==x '; ## Good
eq 'x === '; ## Bad
eq 'x x=== '; ## Bad
eq 'x ===x '; ## Bad
eq 'x x===x'; ## Bad
eq '= x= '; ## Bad
eq '= =x '; ## Bad
eq '= x=x '; ## Bad
eq '= == '; ## Bad
eq '= x== '; ## Bad
eq '= ==x '; ## Bad
eq '= x==x '; ## Bad
eq '= === '; ## Bad
eq '= x=== '; ## Bad
eq '= ===x '; ## Bad
eq '= x===x'; ## Bad
eq 'x= =x '; ## Bad
eq 'x= x=x '; ## Bad
eq 'x= == '; ## Bad
eq 'x= x== '; ## Bad
eq 'x= ==x '; ## Bad
eq 'x= x==x '; ## Bad
eq 'x= === '; ## Bad
eq 'x= x=== '; ## Bad
eq 'x= ===x '; ## Bad
eq 'x= x===x'; ## Bad
eq '=x x=x '; ## Bad
eq '=x == '; ## Bad
eq '=x x== '; ## Bad
eq '=x ==x '; ## Bad
eq '=x x==x '; ## Bad
eq '=x === '; ## Bad
eq '=x x=== '; ## Bad
eq '=x ===x '; ## Bad
eq '=x x===x'; ## Bad
eq 'x=x == '; ## Bad
eq 'x=x x== '; ## Bad
eq 'x=x ==x '; ## Bad
eq 'x=x x==x '; ## Bad
eq 'x=x === '; ## Bad
eq 'x=x x=== '; ## Bad
eq 'x=x ===x '; ## Bad
eq 'x=x x===x'; ## Bad
eq '== x== '; ## Good
eq '== ==x '; ## Good
eq '== x==x '; ## Good
eq '== === '; ## Bad
eq '== x=== '; ## Bad
eq '== ===x '; ## Bad
eq '== x===x'; ## Bad
eq 'x== ==x '; ## Good
eq 'x== x==x '; ## Good
eq 'x== === '; ## Bad
eq 'x== x=== '; ## Bad
eq 'x== ===x '; ## Bad
eq 'x== x===x'; ## Bad
eq '==x x==x '; ## Good
eq '==x === '; ## Bad
eq '==x x=== '; ## Bad
eq '==x ===x '; ## Bad
eq '==x x===x'; ## Bad
eq 'x==x === '; ## Bad
eq 'x==x x=== '; ## Bad
eq 'x==x ===x '; ## Bad
eq 'x==x x===x'; ## Bad
eq '=== x=== '; ## Bad
eq '=== ===x '; ## Bad
eq '=== x===x'; ## Bad
eq 'x=== ===x '; ## Bad
eq 'x=== x===x'; ## Bad
eq '===x x===x'; ## Bad
答案 1 :(得分:0)
考虑一下:
$ cat script.sh
#!/bin/bash
txt="a===b"
re='(^|[^\=])=([^\=]|$)|==='
for txt in ab a=b a==b a==b a===b a= a== a=== =b ==b ===b
do
if [[ $txt =~ $re ]]; then
echo "$txt is Bad"
else
echo "$txt is Good"
fi
done
这会产生输出:
$ bash script.sh
ab is Good
a=b is Bad
a==b is Good
a==b is Good
a===b is Bad
a= is Bad
a== is Good
a=== is Bad
=b is Bad
==b is Good
===b is Bad