分割参数列表

分割参数列表

我想创建一个接受可变数量参数的 bash 函数。必须至少有一个参数。然后我调用另一个程序,需要在接受的第一个参数和其余参数之间插入固定值。

我这样做是基于这个答案

tt() {
  name="$1"
  params="${@:2}"
  someapp ${name} 1234 /some/path "${params}"
}

但它并没有像我想象的那样工作

tt John has fun

结果调用将是

someapp John 1234 /some/path 'has fun' 

注意引号,而我需要结果是

someapp John 1234 /some/path has fun 

最后两个参数不在公共引号中。

答案1

选出第一个参数 ,shift然后使用保存的第一个参数和其余参数调用其他命令:

tt () {
   name=$1
   shift

   someapp "$name" 1234 /some/path "$@"
}

或者,使用像您尝试的那样的命名数组:

tt () {
    name=$1
    params=( "${@:2}" )

    someapp "$name" 1234 /some/path "${params[@]}"
}

您自己的代码的主要问题是您没有创建或使用变量params作为数组。正确执行此操作看起来就像params=( "${@:2}" )使用 at as "${params[@]}",包括双引号和[@]位。

数组赋值总是看起来像name=( ... ),所以你得到的params="${@:2}"不是一个数组,而是一个由从 开始的第二个元素组成的单个字符串"$@",并用空格作为分隔符连接起来。

如果 中没有双引号"${params[@]}",shell 会按空格、制表符和换行符($IFS默认为 中的字符)拆分数组的每个元素,然后对每个生成的单词应用文件名通配。如果没有[@],您只能获得数组的第一个元素。


简约重写:

tt () { someapp "$1" 1234 /some/path "${@:2}"; }

相关内容