代码之家  ›  专栏  ›  技术社区  ›  David Dean

如何在bash中传递完整的参数列表,同时保持多个单词参数在一起?

  •  9
  • David Dean  · 技术社区  · 17 年前

    我对bash变量扩展中的分词有一些问题。我希望能够将参数列表存储在变量中并运行它,但任何引用的多字参数都无法评估我所期望的效果。

    decho 将每个位置参数打印在其自己的行上:

    #!/bin/bash -u
    while [ $# -gt 0 ]; do
      echo $1
      shift
    done
    

    decho a b "c d" 我得到:

    [~]$ decho a b "c d"
    a
    b
    c d
    

    这就是我所期望和想要的。但另一方面,如果我从变量中得到参数列表,我会得到:

    [~]$ args='a b "c d"'
    [~]$ decho $args
    a
    b
    "c
    d"
    

    这不是我想要的。我可以去:

    [~]$ echo decho $args | bash
    a
    b
    c d
    

    $args 在里面 decho $args 这是我所期望的吗?

    5 回复  |  直到 17 年前
        1
  •  5
  •   mouviciel    17 年前

    您可以使用:

    eval decho $args
    
        2
  •  2
  •   Dennis Williamson    17 年前

    您可以在脚本中移动eval:

    #!/bin/bash -u
    eval set -- $*
    for i; 
    do 
      echo $i;
    done
    

    现在您可以执行以下操作:

    $ args='a b "c d"'
    $ decho $args
    a
    b
    c d
    

    $ decho 'a b "c d"'
    a
    b
    c d
    
        3
  •  0
  •   olli-MSFT    17 年前

    您是否尝试过:

    for arg in "$@"
    do
            echo "arg $i:$arg:"
            let "i+=1"
    done
    

    应该产生如下结果:

    arg 1: a
    arg 2: c d
    

    就你而言。

    直接从内存中提取,不保证:-)

        4
  •  0
  •   David Dean    17 年前

    六羟甲基三聚氰胺六甲醚。。 eval decho $args

    [~]$ eval decho $args
    a
    b
    c d
    

    我也许可以使用 "${array[@]}" (其工作原理类似于 "$@" ),但接下来我必须编写代码来加载数组,这将是一件痛苦的事情。

        5
  •  0
  •   crobc1    8 年前

    试图将存储在变量中的参数列表传递给命令从根本上说是有缺陷的。

    假设您在某个地方有代码来创建包含预期参数的变量。对于命令,则可以将其更改为将参数存储到数组变量中:

    decho_argv=(a b 'c d')  # <-- easy!
    

    decho "${decho_argv[@]}"  # USE DOUBLE QUOTES!!!
    

    请注意,使用eval来设置带有普通变量内容的位置参数的建议非常危险。

    例如,假设在下面的示例中,单词“man”被替换为两个单词“rm”和“-rf”,并且最后一个arg单词是“*”:

    > args='arg1 ; man arg4'
    > eval set -- $args
    No manual entry for arg4
    > eval set -- "$args"        # This is no better
    No manual entry for arg4
    > eval "set -- $args"        # Still hopeless
    No manual entry for arg4
    
    > eval "set -- '$args'"  # making it safe also makes it not work at all!
    > echo "$1"
    arg1 ; man arg4
    
    推荐文章