![检测变量的开头 { 和结尾 }](https://linux22.com/image/1207767/%E6%A3%80%E6%B5%8B%E5%8F%98%E9%87%8F%E7%9A%84%E5%BC%80%E5%A4%B4%20%7B%20%E5%92%8C%E7%BB%93%E5%B0%BE%20%7D.png)
我如何检测变量的开盘{
和收盘}
,例如
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