【问题标题】:Get all but first N arguments to a bash function获取 bash 函数的除前 N 个参数之外的所有参数
【发布时间】:2019-07-07 19:16:27
【问题描述】:

我知道如何get the last argument passed to a function,但我想知道如何在前两个之后获取函数的所有参数:

例如:

function custom_scp(){
    PORT=$1
    USER=$2
    SOURCES=`ALL_OTHER_ARGS`
    scp -P $PORT -r $SOURCES $USER@myserver.com:~/
}

因此将三个文件发送到远程home 目录看起来像

$ custom_scp 8001 me ./env.py ./test.py ./haha.py

【问题讨论】:

  • 顺便说一句,请参阅wiki-dev.bash-hackers.org/scripting/obsolete -- function foo() { 正在以一种与 noither POSIX sh nor 兼容的方式混合 POSIX sh 和 ksh 函数声明格式i> 使用旧版 ksh​​。任选其一:foo() { 是 POSIX 形式,function foo { 是 ksh 形式。
  • 顺便说一句,回复:在我的回答中使用小写名称,这是故意的。例如,USER 是一个保留的变量名。通过覆盖它,您可能会破坏稍后在同一会话中运行的其他命令。请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/…——全大写名称用于修改系统行为的变量,小写名称保留供应用程序使用。设置与环境变量同名的 shell 变量会覆盖后者,因此命名空间规则适用于这两个集合。

标签: bash function shell


【解决方案1】:

当你完成它们时,只需将前面的 shift 去掉;剩下的将在"$@" 中。

这具有与所有 POSIX shell 兼容的优点(下面使用的唯一扩展是 local,它是一个广泛使用的扩展,甚至在 dash 中也可用)。

custom_scp() {
  local user port  # avoid polluting namespace outside your function
  port=$1; shift   # assign to a local variable, then pop off the argument list
  user=$1; shift   # repeat
  scp -P "$port" -r "$@" "${user}@myserver.com:~/"
}

【讨论】:

    【解决方案2】:

    您可以使用数组切片表示法:

    custom_scp() {
        local port=$1
        local user=$2
        local sources=("${@:3}")
    
        scp -P "$port" -r "${sources[@]}" "$user@myserver.com:~/"
    }
    

    引用Bash manual:

    ${parameter:offset}
    ${parameter:offset:length}

    如果参数@,则结果是长度偏移量开始的位置参数。

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 2023-04-04
      • 2023-03-10
      • 1970-01-01
      • 2012-06-24
      • 2011-09-11
      • 2017-02-27
      • 2017-12-23
      相关资源
      最近更新 更多