如何对 grep 进行通配符转换?是否应该在 bash 脚本中转义通配符 ( *
)?还是仅在命令行中写入时才转义?如何检测{...}
变量中的括号模式?
#!/bin/bash
phrs="Gnu"
fdir=( "$HOME" )
isufx=( "--include=\*.{c,cpp,f95,f90,f03,f08}" )
grep --null -r -l "${isufx[@]}" -e "$phrs" -- "${fdir[@]}"
答案1
我认为最好的做法是将其转义(或引用)除非set -f
您已使用或完全禁用通配符set -o noglob
。如果没有其他内容,这将明确您的意图:
isufx=( --include=\*.{c,cpp,f95,f90,f03,f08} )
如果您使用引号,请记住,无论如何,括号扩展都是由 shell 完成的,因此必须取消引号。特别是,允许在数组构造函数内部进行括号扩展:
isufx=( "--include=*."{c,cpp,f95,f90,f03,f08} )
然而,globs 与整个匹配单词,因此您需要有一个像--include=foo.c
或 这样的文件名--include=bar.f95
,以便*
shell 能够真正扩展。