当参数是数组时,如何扩展参数?
如果参数是一个简单变量,我们可以使用感叹号进行间接寻址。
single_fruit()
{
if [ "$#" != 1 ]; then exit 1; fi
echo ${!1}
}
MYVAR=Persimmon
single_fruit MYVAR
我想对数组参数做同样的事情。而不是直接迭代数组的元素:
FRUIT=(Papaya Pineapple)
for f in ${FRUIT[@]}
do
echo ${f}
done
我想在函数中迭代:
multi_fruit()
{
if [ "$#" != 1 ]; then exit 1; fi
PARAMETER=${1}
for i in ${!PARAMETER[@]}
do
echo ${i}
done
}
MOREFRUITS=(Mango Melon)
multi_fruit MOREFRUITS
你能让最后一个函数迭代数组元素吗?
答案 0 :(得分:2)
在BASH中传递数组并不简单。实际上,数组甚至不会导出到子shell。要将数组变量传递给函数,您需要使用“ARRAY [@]”语法,然后使用变量间接运算符重构函数内的数组。
考虑这个脚本:
multi_fruit() {
if [ "$#" != 1 ]; then exit 1; fi
# array reconstructions
arr=("${!1}")
for i in ${arr[@]}
do
echo ${i}
done
}
MOREFRUITS=(Mango Melon)
multi_fruit "MOREFRUITS[@]"
<强>输出:强>
Mango
Melon
答案 1 :(得分:2)
你可以这样做,但是以一种意想不到的方式:占位符var需要包含数组索引:
multi_fruit() {
(( $# != 1 )) && return 1
tmp="${1}[@]"
for i in "${!tmp}"; do
echo "$i"
done
}
此外,仅使用大写变量名称是个坏主意。有一天你会不小心覆盖PATH并想知道为什么你的脚本坏了。将大写变量留给系统。
另请注意,在变量周围加上大括号与双引号不同。例如,考虑:
var="one two three"
printf "%s\n" ${var}
printf "%s\n" "$var"
答案 2 :(得分:2)
这有效:
multi_fruit()
{
if [ $# -lt 1 ]; then exit 1; fi
for i in "$@"
do
echo ${i}
done
}
MOREFRUITS=(Mango Melon)
multi_fruit "${MOREFRUITS[@]}"