代码之家  ›  专栏  ›  技术社区  ›  Poshi

通过变量传递命令行参数

  •  1
  • Poshi  · 技术社区  · 6 年前

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

    比如说,我想用用户给我的一组单词对一个文件进行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
    <No output>
    

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

    如果我不带引号运行该命令,它会工作,但它也会触发shellcheck.net中的SC2086警告,这是我试图避免的。

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   PesaThe    6 年前

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

    您可以这样构建参数:

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