传递给函数时如何访问数组元素

时间:2014-03-06 21:13:58

标签: bash function

当我们将数组传递给bash脚本中的函数时,我们如何访问元素?例如,我有这个代码:

check_corrects() {
    local inp=$1[@]
    echo # i want to echo inp[0]
}
a=(1 2 3)
check_corrects a 

我如何回应inp[0]

3 个答案:

答案 0 :(得分:3)

您不能将数组作为参数传递给shell函数。参数只是编号参数。您可以使数组成为这些参数:

testa() { echo "$#"; }
a=(1 2 3)
testa "${a[@]}"
3

但是testa $a会回显1,因为它只会将'a'的第一个元素传递给testa。

但是,这意味着,在您的情况下,如果您只是直接回应数组扩展,那么您将获得第一个参数,这就是您想要的。

echo "$1"

答案 1 :(得分:1)

警告:未来极度丑陋。不适合胆小的人:

check_corrects() {
    local arrayref="$1[@]"
    local array=("${!arrayref}")   # gulp, indirect variable
    local idx=$2
    echo "${array[$idx]}"
}

现在,让我们来测试一下

a=( 1 2 "foo bar" 3)
check_corrects a 2      # ==> "foo bar"

呼。

不适用于关联数组:“$ {ary [@]}”仅返回值,而不是键。 此外,不适用于键不连续的数字数组。

答案 2 :(得分:1)

只是为了阐述kojiro的答案,这是非常正确的......

当我想传递整个数组时,我经常做的是:

foo() {
  local a=( "$@" )
  ...
}

a=(1 2 3)
foo "${a[@]}"

这基本上将值重建为foo()内的数组。请注意,如果单个数组元素的值可能包含空格,则引号是至关重要的。例如:

foo() {
  local a=( "$@" )
  echo "foo: Number of elements in a: ${#a[@]}"
}

bar() {
  local a=( $@ ) # wrong
  echo "bar: Number of elements in a: ${#a[@]}"
}

a=(1 2 3 4)
foo "${a[@]}"  # Reports 4 elements, as expected
bar "${a[@]}"  # Also reports 4 elements, so where's the problem?

a=("1 2" 3 "4 5 6")
foo "${a[@]}"  # Reports 3 elements, as expected
bar "${a[@]}"  # Reports 6 elements. Oops!

编辑虽然我的示例没有显示,但主叫方的引号也很重要。也就是说,如果您执行foo ${a[@]},则会遇到与上面示例中的bar相同的问题。底线是,如果您的数组元素将包含空格,则需要使用引号。有关更详细的说明,请参阅What is the difference between $@ and $* in shell scripts?