说我有这些巴什脚本中的函数:
foo(){
my_args_array=("$@")
export my_args="${my_args_array[@]}"
bar $my_args
}
bar(){
echo "number of args: $#";
}
foo a b 'c d e'
如果我运行上面的脚本,我会得到:
参数数量:5
但我正在寻找的是:
参数数量:3
所以我的问题是 - 有没有办法映射 返回的值my_args_array[@]
,这样我就可以用单引号将每个元素括起来?或者做任何我需要做的事情来使环境变量字符串看起来像原始的命令行参数。
答案1
使用数组,而不是字符串:
#!/bin/bash
foo(){
my_args=("$@")
bar "${my_args[@]}"
}
bar(){
echo "number of args: $#";
}
foo a b 'c d e'
答案2
在 Bash 中,在赋值的右侧使用"${array[@]}"
(or ) 的工作方式有点像(or ):它将数组元素连接到单个字符串,使用空格作为分隔符。 (( ) 使用 的第一个字符(字节?)。)这也适用于、等的参数。"$@"
${array[*]}
"$*"
${array[*]}
"$*"
IFS
export
declare
local
然后你就得到了a b c d e
in my_args
,并且未加引号的扩展被分割。
如果你想要一个数组,请使用数组:
foo() {
bar "$@"
}
bar() {
echo "number of args: $#";
}
foo a b 'c d e'
或者,如果您想要一个字符串,为了清楚起见,最好明确使用"${array[*]}"
。