2017-06-27 1 views
1

je suis sous bash et essayé de faire correspondre une courte chaîne avec un motif:Bash pour tester regex-match, semble toujours revenir OK même pas correspondre

$[[ "ab" =~ "^a*" ]] 
$echo $? 
0 

OK, comme je m'y attendais, mais je changé en «^b * », je pense cette fois-ci, il ne correspond pas:

$[[ "ab" =~ "^b*" ]] 
$echo $? 
0 

Étrangement la valeur de retour est encore « OK ». Pourquoi est-ce, où est-ce que je me suis trompé? Merci.

+0

'^ b *' signifie 0 ou plus au début 'b' si évidemment il correspondra à toute entrée. – anubhava

+0

n'utilisez pas de guillemets doubles sur RHS! –

Répondre

2

Regex ^b* signifie 0 ou plus b au début donc évidemment, il reviendra vrai pour toute entrée.

Vous devez utiliser + quantificateurs pour 1 ou plusieurs correspondances et éviter de citer regex en bash comme ceci:

[[ "ab" =~ ^a+ ]] && echo 'ok' || echo 'no' 
ok 

[[ "ab" =~ ^b+ ]] && echo 'ok' || echo 'no' 
no 

De même, vous pouvez utiliser ^a ou ^a.* ainsi.

+0

ou '^ a. *', Ou juste '^ a' ... –

+0

oui juste ...... – anubhava

1

En plus de anubhava's correct answer, et parce que le regex de bash sont particulièrement chers, je dirais:

Si votre besoin est de vérifier la présence d'un caractère à la 1ère position d'une chaîne, et parce que ce genre de des tests ont à faire contre les variables :

myVar="ab" 

[ "$myVar" ] && [ -z "${myVar%%a*}" ] && echo "String '$myVar' begin with 'a'" 

Affichera: String 'ab' begin with 'a', mais

myVar="ab" 

[ "$myVar" ] && [ -z "${myVar%%b*}" ] && echo "String '$myVar' begin with 'b'" 

ne produira rien!

Voir aussi: String contains in Bash