我想创建一个接受可变数量参数的 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}"; }