Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

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

$ 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...