Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why quote removal isn't performed between [[ ... ]]?

Tags:

bash

$ man bash

Word splitting and filename expansion are not performed on the words between the ‘[[’ and ‘]]’; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and quote removal are performed.

$ echo $BASH_VERSION
4.2.10(1)-release

command 1

$ [[ "hello" =~ "he"   ]] && echo YES || echo NO
YES

command 2

$ [[ "hello" =~  he.*  ]] && echo YES || echo NO
YES

command 3

$ [[ "hello" =~ "he.*" ]] && echo YES || echo NO
NO

Why command 2 and 3 are different?

like image 913
kev Avatar asked Feb 21 '23 04:02

kev


1 Answers

Check your bash version. Starting from version 3.2 this behavior was added that states:

Quoting the string argument to the [[ command's =~ operator now forces string matching, as with the other pattern-matching operators.

I guess you are using bash >= ver 3.2 for your test.

That's the reason when you quote the regular expression it is doing plain simple string matching instead of regex matching.

Update: If you want regex matching inside double quotes then use:

shopt -s compat31

As per the manual:

compat31

If set, bash changes its behavior to that of version 3.1 with respect to quoted arguments to the conditional command's =~ operator.

which causes your command to behave differently:

[[ "hello" =~ "he.*" ]] && echo YES || echo NO
YES
like image 151
anubhava Avatar answered Feb 28 '23 10:02

anubhava