检测变量的开头 { 和结尾 }

检测变量的开头 { 和结尾 }

我如何检测变量的开盘{和收盘},例如

 var="\*.{cp,cpp,f90,f95,f03,f08}"

以下不起作用

[[ "$ext" =~ {(.*)} ]] && echo "Detected {}"

答案1

您可以使用简单的模式匹配在 bash 扩展测试构造中使用==(或者,等效地) :=[[ ... ]]

[[ $var == *{*}* ]]

单词拆分和路径名扩展不在内部执行[[ ... ]],因此您不需要引用 LHS 或 RHS。

如果你想使用正则表达式匹配,那么你需要转义或引用括号,因为它们在 bash 扩展正则表达式中很特殊,但是不是.*

[[ $var =~ \{.*\} ]]

或者

[[ $var =~ "{".*"}" ]]

请注意以下其他差异:

  • 普通的模式匹配(带==)作用于整个字符串,因此您至少需要一个前导*通配符来匹配左括号之前的内容(*如果您期望右括号后的字符,则需要一个尾随通配符)

  • 正则表达式匹配( =~) 匹配字符串中的任何位置(除非以^and/or为锚点),因此您只需在两者之间$使用通配符即可。严格来说,它应该匹配一系列非闭合括号,后跟闭合括号。.*\{[^}]*\}


话虽这么说,我怀疑你真的不想 \*.{cp,cpp,f90,f95,f03,f08} 在一个多变的因为括号扩展实际上不会扩展,除非你使用类似 eval echo "$var"

答案2

在 bash 中尝试这个来查看结果:

var="\*.{cp,cpp,f90,f95,f03,f08}"
[[ $var =~ "{" ]] && echo found || echo not in var
[[ $var =~ "X" ]] && echo found || echo not in var

相关内容