在 Bash 脚本中转义 grep 通配符

在 Bash 脚本中转义 grep 通配符

如何对 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 能够真正扩展。

相关内容