【问题标题】:Prepend to command line arguments in linux/bash在 linux/bash 中添加到命令行参数
【发布时间】:2014-03-14 11:24:03
【问题描述】:

我想将提供给脚本的命令行参数传递给另一个命令,但我还想先在前面添加一些额外的参数。我怎么能用 bash 做到这一点?

这会将所有参数发送到命令:

command $@

但我想要更多类似的东西:

command [argument1, argument2, $@]

你怎么能在 bash 中做这样的事情?

【问题讨论】:

    标签: linux bash command-line-arguments


    【解决方案1】:

    @ThatOtherGuy 的回答是正确的。

    如果您希望将几个参数“取消移位”到位置参数中,请执行以下操作:

    set -- arg1 arg2 "$@"
    cmd "$@"
    

    【讨论】:

      【解决方案2】:

      如果你有grep foo并且你想在foo之前添加-f,你可以使用grep -f foo。同样的事情也适用于这里:

      cmd argument1 argument2 "$@"
      

      【讨论】:

      • @bt,请注意此处使用引号。这非常重要:它完全按照接收到的方式传递参数。
      • 谢谢!完美运行!在什么情况下不能在 $@ 周围加上引号把你弄乱?
      • $@ 的行为与$* 类似,并且受分词和通配符的影响。最常见的表现是你不能对包含空格的文件名做任何事情。
      • 嗯,正在寻找一种方法来代替cmd "x y $@",以便稍后我可以在cmd 中操作“$1”
      • @AlexanderMills 这是一个非常糟糕的设计决定,我强烈建议您重新考虑。该脚本将很脆弱,无法处理带有空格的参数。如果你坚持,你可以使用cmd "x y $*"
      【解决方案3】:

      如果您想要更通用的方法来执行此操作(推荐),请使用:

      #!/usr/bin/env bash
      
      function xyz {
        echo "${args[@]}"  # arguments will printed out
      }
      
      function abc {
          local args=()
          args+=(argument1)
          args+=(argument2)
          args+=("$@")
          xyz "${args[@]}"
      }
      

      为了测试,源码上面的代码

      source script.sh && abc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-10
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多