我正在尝试通过添加带有来自“外部世界”(即用户输入)的信息的参数来构建命令行。
说我想为用户提供的一组单词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警告,我正试图避免这种情况。
我已经尝试了数组,括号,引号的几种组合...但是我无法根据自己的需要确定确切的语法。有语法吗?
答案 0 :(得分:4)
如果引用参数字符串,它将被解释为一个长参数。如果不引用它,那么您将依靠分词,这有很多警告,不建议这样做。
您可以构建如下参数:
arg=()
arr=(foo bar)
for a in "${arr[@]}"; do arg+=(-e "$a"); done
grep "${arg[@]}" input