Linux 在bash脚本中使用grep命令将变量值传递给--include参数

Linux 在bash脚本中使用grep命令将变量值传递给--include参数,linux,bash,shell,grep,Linux,Bash,Shell,Grep,我希望使用--include参数将要搜索的文件扩展名传递给grep命令(在bash脚本中)。 这些文件扩展名将由用户从命令行作为参数输入(第四个参数以逗号分隔的方式保存文件扩展名) 这是我的剧本: ... echo "Searching in ${4} files for pattern" egrep -irn . --include=\*.{"${4}"} --exclude=\*.{class} -e "${3}" ... 我还尝试使用命令创建字符串,并调用eval,如下所示: ...

我希望使用--include参数将要搜索的文件扩展名传递给grep命令(在bash脚本中)。 这些文件扩展名将由用户从命令行作为参数输入(第四个参数以逗号分隔的方式保存文件扩展名)

这是我的剧本:

...
echo "Searching in ${4} files for pattern"
egrep -irn . --include=\*.{"${4}"} --exclude=\*.{class} -e "${3}"
...  
我还尝试使用命令创建字符串,并调用eval,如下所示:

...
comando="egrep -irn . --include="\\*.{${4}}" --exclude=\*.{class} -e "${3}""
echo $comando
resultado=eval $comando
echo $resultado
(在回显comando时,我得到了这样的结果:egrep-irn。--include=*.{wsdl,xml}--exclude=*.{class}-e texto,这正是命令行中执行时返回一些匹配项的命令。)

我还尝试传递一个包含所有include参数的变量:

...
argumento="\\*.{${4}}"
egrep -irn . --include=$argumento --exclude=\*.{class} -e "${3}"
...
以下是从命令行调用脚本的方式:

sh./searchRecursiveIterativeRegrep.sh/tmp/test/other//usr/local/aux/“texto”wsdl,xml

关于如何实现这一点有什么想法吗?
谢谢你

我刚刚理解了你为什么会遇到问题:如果我复制/粘贴生成的命令,它会工作,但在shell中它不会

因此,我建议作为一种解决办法

argumento="\\*.{${4}}"
echo egrep -irn . --include=$argumento --exclude=\*.{class} -e "${3}" | sh
(通过管道将回声传送到一个新的外壳:它工作了)。也许这不是最好的答案,但它确实起到了作用


也许有人可以解释这一点,或者给出一个更好、更清晰的答案。

我刚刚理解了为什么会出现问题:如果我复制/粘贴生成的命令,它可以工作,但在shell中却不能

因此,我建议作为一种解决办法

argumento="\\*.{${4}}"
echo egrep -irn . --include=$argumento --exclude=\*.{class} -e "${3}" | sh
(通过管道将回声传送到一个新的外壳:它工作了)。也许这不是最好的答案,但它确实起到了作用


也许有人可以解释一下,或者拿出一个更好的,更清晰的答案。

您没有提供任何样本输入或预期输出,因此这显然未经测试,但正确的方法是使用
find
查找文件和
grep
查找G全局搜索文件中的Regular
Expression并打印匹配文本(请参见其名称中的提示;-))。比如:

find . -type f -name "*.$4" -print0 | xargs -0 grep -Ein "$3"

伙计,沙格斯,和grep获取详细信息。

您没有提供任何样本输入或预期输出,因此这显然未经测试,但正确的方法是使用
find
查找文件和
grep
查找G全局搜索文件中的R正则E表达式和print匹配文本(请参见其名称中的提示;-))。比如:

find . -type f -name "*.$4" -print0 | xargs -0 grep -Ein "$3"

man find、xargs和grep了解详细信息。

用于查找文件的UNIX工具被恰当地命名为
find
,而不是
grep
。忘记你曾经看到过GNU greps用于查找文件的选项,因为添加它们是一个糟糕的主意(下一步是什么-grep选项对输出进行排序?),只需使用
find
查找文件和
grep
全局搜索文件中的正则表达式并打印匹配文本。你的生活会简单得多。我正试图在文件中找到正则表达式,所以我需要grep。该命令按预期工作,但我无法使用命令行中的参数。a)grep不是唯一可以在文件中查找正则表达式的工具,b)我不是建议您不要使用grep在文件中查找正则表达式,我建议您不要使用grep来查找文件,因为这是一种错误的方法,并且使您的grep命令变得非常复杂。使用
find
查找文件,使用
grep
(或其他工具)在
find
查找的文件中搜索regexp。类似于
查找的东西-名称'*.extension'-print0 | xargs-0 grep'regexp'
。我没有提供所有脚本详细信息。我使用find来查找文件,然后使用grep来查找那些找到的文件中的模式。那么为什么您也使用grep来查找文件(-r,--include,--exclude)?简单地说,永远不要使用这些参数,它们是与UNIX的理念背道而驰的,即让每个工具都能完成一项工作,并且做得很好——只需使用为每项工作设计的工具即可。你已经在经历不那样做的痛苦了。我只能说:祝你好运!用于查找文件的UNIX工具适当地命名为
find
,而不是
grep
。忘记你曾经看到过GNU greps用于查找文件的选项,因为添加它们是一个糟糕的主意(下一步是什么-grep选项对输出进行排序?),只需使用
find
查找文件和
grep
全局搜索文件中的正则表达式并打印匹配文本。你的生活会简单得多。我正试图在文件中找到正则表达式,所以我需要grep。该命令按预期工作,但我无法使用命令行中的参数。a)grep不是唯一可以在文件中查找正则表达式的工具,b)我不是建议您不要使用grep在文件中查找正则表达式,我建议您不要使用grep来查找文件,因为这是一种错误的方法,并且使您的grep命令变得非常复杂。使用
find
查找文件,使用
grep
(或其他工具)在
find
查找的文件中搜索regexp。类似于
查找的东西-名称'*.extension'-print0 | xargs-0 grep'regexp'
。我没有提供所有脚本详细信息。我使用find来查找文件,然后使用grep来查找那些找到的文件中的模式。那么为什么您也使用grep来查找文件(-r,--include,--exclude)?简单地说,永远不要使用这些参数,它们是与UNIX的理念背道而驰的,即让每个工具都能完成一项工作,并且做得很好——只需使用为每项工作设计的工具即可。你已经在经历不那样做的痛苦了。我只能说:祝你好运!此命令在具有多个扩展名的命令行中工作。白鹭-irn--include=*.{wsdl,xml}--exclude=*.{class}-e textoth此命令在具有多个扩展名的命令行中工作。白鹭-irn--include=*.{wsdl,xml}--exclude=*.{class}-e texto