Bash中数组参数的间接参数扩展

时间:2013-12-16 18:19:50

标签: bash

当参数是数组时,如何扩展参数?

如果参数是一个简单变量,我们可以使用感叹号进行间接寻址。

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

你能让最后一个函数迭代数组元素吗?

3 个答案:

答案 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[@]}"