我正在编写如上所述的 bash脚本,但参数扩展不适用于EXC
变量。
#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find /path -exec grep ${EXC} "xxx" {} \; >> result.txt
EXC
调用未使用grep
变量中的选项,因为它仍会解析JavaScript文件......
也试过
find /path -exec grep $EXC "xxx" {} \; >> result.txt
答案 0 :(得分:1)
您可以使用find
(非)运算符与!
选项结合来过滤-name
个结果。要排除.js
和.sh
个文件:
find . -type f ! -name '*.js' ! -name '*.sh' -exec grep xxx {} \;
答案 1 :(得分:0)
它仍然会解析,或者只是通过查找您尝试排除的文件来应用它?
无论如何,为什么不只使用 grep -r 而不是 find 加上 grep ?
grep -r --exclude='*.js' --exclude='*.sh' "xxx" /path
答案 2 :(得分:0)
问题在于我使用变量来保存一些参数,并且参数扩展不会在命令行中用$ {}替换它的值...
你可以启动一个可以执行你想要的子shell
#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find /path -exec bash -c "grep ${EXC} 'xxx' {}" \; >> result.txt
答案 3 :(得分:0)
问题是单引号未从参数扩展中删除,因此grep
正在接收'*.js'
作为模式,而不是*.js
。您需要使用数组来保存参数:
exc=( "--exclude=*.js" "--exclude=*.sh" ) # No single quotes needed
find /path -exec grep "${exc[@]}" "xxx" {} \; >> result.txt
引用的参数扩展会阻止*.js
和*.sh
被shell扩展,就像在字面上使用它时引用它们一样。 --exclude='*.js'
和'--exclude=*.js'
都会导致相同的参数传递给grep
,极简主义--exclude=\*.js
也是如此。您也可以将数组定义为
exc=( --exclude "*.js" --exclude "*.sh" )
因为long选项及其参数可以指定为包含=
的单词或两个单独的单词。
答案 4 :(得分:0)
这些可以帮到你;
#!/bin/bash
EXC="--exclude='*.js' --exclude='*.sh'"
find /path -exec echo "grep ${EXC} 'xxx' {}" \; | bash > result.txt
或
#!/bin/bash
EXC="*js,*sh"
find /path -exec echo "grep --exclude={${EXC}} 'xxx' {}" \; | bash > result.txt