为什么在[[...]]之间不执行引用删除?

kev*_*kev 4 bash

$ man bash
Run Code Online (Sandbox Code Playgroud)

不对'[['和']]'之间的单词执行单词拆分和文件名扩展; 执行波形扩展,参数和变量扩展,算术扩展,命令替换,进程替换和引用删除.

$ echo $BASH_VERSION
4.2.10(1)-release
Run Code Online (Sandbox Code Playgroud)

命令1

$ [[ "hello" =~ "he"   ]] && echo YES || echo NO
YES
Run Code Online (Sandbox Code Playgroud)

命令2

$ [[ "hello" =~  he.*  ]] && echo YES || echo NO
YES
Run Code Online (Sandbox Code Playgroud)

命令3

$ [[ "hello" =~ "he.*" ]] && echo YES || echo NO
NO
Run Code Online (Sandbox Code Playgroud)

为什么命令2和3不同?

anu*_*ava 7

检查你的bash版本.从版本3.2开始,添加了以下状态:

引用[[command's =〜运算符]的字符串参数现在强制字符串匹配,就像其他模式匹配运算符一样.

我猜你正在使用bash> = ver 3.2进行测试.

这就是你引用正则表达式的原因,它正在进行简单的字符串匹配而不是正则表达式匹配.

更新:如果你想在双引号内匹配正则表达式,那么使用:

shopt -s compat31
Run Code Online (Sandbox Code Playgroud)

根据手册:

compat31

如果设置,bash将其行为更改为版本3.1的行为,相对于条件命令的=〜运算符的引用参数.

这会导致您的命令行为不同:

[[ "hello" =~ "he.*" ]] && echo YES || echo NO
YES
Run Code Online (Sandbox Code Playgroud)