$ man bash
Run Code Online (Sandbox Code Playgroud)
不对'[['和']]'之间的单词执行单词拆分和文件名扩展; 执行波形扩展,参数和变量扩展,算术扩展,命令替换,进程替换和引用删除.
$ echo $BASH_VERSION
4.2.10(1)-release
Run Code Online (Sandbox Code Playgroud)
$ [[ "hello" =~ "he" ]] && echo YES || echo NO
YES
Run Code Online (Sandbox Code Playgroud)
$ [[ "hello" =~ he.* ]] && echo YES || echo NO
YES
Run Code Online (Sandbox Code Playgroud)
$ [[ "hello" =~ "he.*" ]] && echo YES || echo NO
NO
Run Code Online (Sandbox Code Playgroud)
为什么命令2和3不同?
检查你的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)