当我们将数组传递给bash脚本中的函数时,我们如何访问元素?例如,我有这个代码:
check_corrects() {
local inp=$1[@]
echo # i want to echo inp[0]
}
a=(1 2 3)
check_corrects a
我如何回应inp[0]
?
答案 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?