Bash 通过变量传递命令行参数

Bash 通过变量传递命令行参数,bash,Bash,我试图通过添加带有“外部世界”(即用户输入)信息的参数来构造命令行 假设我想为用户给我的一组单词创建一个grep文件(这只是为了向您展示用例,我确实在尝试运行一个生物信息学代码,但每个人都有grep,用于测试目的)。我的想法是在bash数组中有一个单词列表: $ L=("foo" "bar") 我想用这个列表得到一行,相当于 $ grep -e foo -e bar input.txt 我使用了一种生成needes参数字符串的方法 $ P=${L[@]/#/-e } $ echo "$P"

我试图通过添加带有“外部世界”(即用户输入)信息的参数来构造命令行

假设我想为用户给我的一组单词创建一个grep文件(这只是为了向您展示用例,我确实在尝试运行一个生物信息学代码,但每个人都有
grep
,用于测试目的)。我的想法是在bash数组中有一个单词列表:

$ L=("foo" "bar")
我想用这个列表得到一行,相当于

$ grep -e foo -e bar input.txt
我使用了一种生成needes参数字符串的方法

$ P=${L[@]/#/-e }

$ echo "$P"
-e foo -e bar
但我不能按原样使用它(假设文件包含foo和bar):

$grep“$P”input.txt
最后一个命令,实际搜索字符串“-e foo-e bar”

如果我在没有引号的情况下运行该命令,它会工作,但它也会触发shellcheck.net中的SC2086警告,我正试图避免这种情况


我已经尝试了数组、括号、引号的几种组合。。。但我无法根据自己的需要确定确切的语法。有人有这种语法吗?

如果引用参数字符串,它将被解释为一个长参数。如果你不引用它,那么你就依赖于分词,这有很多警告,不推荐使用

您可以构建如下参数:

arg=()
arr=(foo bar)
for a in "${arr[@]}"; do arg+=(-e "$a"); done

grep "${arg[@]}" input

如果引用参数字符串,它将被解释为一个长参数。如果你不引用它,那么你就依赖于分词,这有很多警告,不推荐使用

您可以构建如下参数:

arg=()
arr=(foo bar)
for a in "${arr[@]}"; do arg+=(-e "$a"); done

grep "${arg[@]}" input