【问题标题】:How to remove an item in Bash array?如何删除 Bash 数组中的项目?
【发布时间】:2012-02-20 04:25:20
【问题描述】:

我想将所有脚本参数传递给foo 函数,如果第一个参数是something,则将所有其余参数传递给bar 函数。

我是这样实现的:

foo() {
  if [ "$1" = 'something' ]; then
    args=("$@")
    unset args[0]
    bar $args
  fi
}

foo $@

这样可以简化吗?

【问题讨论】:

    标签: arrays bash arguments command-line-arguments


    【解决方案1】:

    是的,使用shift

    foo(){ 
      if [[ $1 == 'something' ]]; then
        shift
        bar "$@" 
      fi
    }
    
    foo "$@"
    

    【讨论】:

    • 谢谢! foo "$@"bar "$@" 中是否真的需要引号?
    • @MishaMoroshko 这不是必需的,但您应该始终引用您的变量,除非您明确有理由不这样做。大多数时候你想要分词。我没有引用$1,因为您在[[ ]] 内部没有分词问题。我不相信这同样适用于[ ]
    • @SiegeX 您仍然应该引用$1,因为如果没有传递参数[: ==: unary operator expected,它将失败。
    • @nicerobot 这只是[ ] 的问题,而不是[[ ]]。这就是为什么我在之前的评论中说 我不相信这同样适用于 [ ] 虽然
    • @SiegeX 哦!该死的选择性感知。我的眼睛甚至没有注册[[ ]]。 :)
    【解决方案2】:

    如果您不需要 args 数组来处理 foo 中的任何其他内容,您可以完全避免它,就像 SiegeX 的回答一样。如果您出于其他原因需要args,您正在做的是最简单的方法。

    您的代码中存在错误。当您调用bar 时,您只传递了args 的第一个元素。要传递所有元素,您需要这样做:

    bar "${args[@]}"
    

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2018-01-14
      • 2016-09-07
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2016-10-30
      相关资源
      最近更新 更多