通过变量传递命令行参数

时间:2018-08-20 12:56:43

标签: bash

我正在尝试通过添加带有来自“外部世界”(即用户输入)的信息的参数来构建命令行。

说我想为用户提供的一组单词grep一个文件(这只是为了向您展示用例,我实际上是在尝试运行生物信息学代码,但是每个人都有{{1} }进行测试)。我的想法是在bash数组中有一个单词列表:

grep

我想使用该列表以等效于

的行结尾
$ L=("foo" "bar")

我使用了一种生成带有Needes参数字符串的方法

$ grep -e foo -e bar input.txt

但是我不能按原样使用它(假定文件包含foo和bar):

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

$ echo "$P"
-e foo -e bar

最后一个命令,实际上是搜索字符串“ -e foo -e bar”。

如果我在不带引号的情况下运行该命令,则可以正常运行,但它还会在shellcheck.net中触发SC2086警告,我正试图避免这种情况。

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

1 个答案:

答案 0 :(得分:4)

如果引用参数字符串,它将被解释为一个长参数。如果不引用它,那么您将依靠分词,这有很多警告,不建议这样做。

您可以构建如下参数:

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

grep "${arg[@]}" input