获取bash函数中除前N个参数外的所有参数

8
我知道如何获取传递给函数的最后一个参数,但我想知道如何获取函数中除前两个参数外的所有参数:
例如:
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

3
顺便提一下,参见 https://wiki-dev.bash-hackers.org/scripting/obsolete -- function foo() { 混合了 POSIX sh 和 ksh 函数声明格式,既不兼容 POSIX sh 也不兼容传统的 ksh。请选择其中一种:foo() { 是 POSIX 格式,function foo { 是 ksh 格式。 - Charles Duffy
3
顺便提一下,关于我回答中使用小写名称的问题,那是故意的。例如,USER是一个保留的变量名。通过覆盖它,你可能会破坏后面在同一会话中运行的其他命令。请参见http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html -- 大写名称用于修改系统行为的变量,小写名称保留供应用程序使用。如果使用与环境变量相同的名称设置Shell变量,则会覆盖后者,因此命名空间规则适用于两个集合。 - Charles Duffy
2个回答

12

完成前面的使用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:~/"
}

7
您可以使用数组切片表示法:
custom_scp() {
    local port=$1
    local user=$2
    local sources=("${@:3}")

    scp -P "$port" -r "${sources[@]}" "$user@myserver.com:~/"
}

引用自Bash手册:

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

如果parameter@,则结果是从offset开始的length个位置参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接