在下面的代码片段中,我发现,当尝试将多个数组传递给 Bash 中的函数时,我可以使用第一个示例中的语法来执行此操作,但前提是:
- 数组变量名称以下划线 (_) 为前缀
- 数组变量名称在接收函数中的名称与调用函数的名称相同
function list_arrays {
local _array_one=$1
local _array_two=$2
for ip in "${array_one[@]}"; do
echo "$ip"
done
for node in "${array_two[@]}"; do
echo "$node"
done
}
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
list_arrays "${array_one[@]}" "${array_two[@]}"
}
main
输出:
1
2
3
4
5
one
two
three
four
five
稍微改变示例以删除下划线......
#!/bin/bash
function list_arrays {
local array_one=$1
local array_two=$2
for ip in "${array_one[@]}"; do
echo "$ip"
done
for node in "${array_two[@]}"; do
echo "$node"
done
}
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
list_arrays "${array_one[@]}" "${array_two[@]}"
}
main
输出:
1
2
最后一次迭代以更改 list_arrays 函数中数组变量的名称
#!/bin/bash
function list_arrays {
local _array_first=$1
local _array_second=$2
for ip in "${_array_first[@]}"; do
echo "$ip"
done
for node in "${_array_second[@]}"; do
echo "$node"
done
}
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
list_arrays "${array_one[@]}" "${array_two[@]}"
}
main
输出:
(无输出)
该行为非常方便,但在生产脚本中使用它之前我想了解我在做什么。起初我以为这可能与引用传递。然而,这种语法在 Bash 4.1 中有效,这似乎是在添加引用传递之前。
答案1
该代码按预期工作:
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
list_arrays "${array_one[@]}" "${array_two[@]}"
}
传递的参数不是两个数组,而是1 2 3 4 5 one two three four five
.
该函数list_arrays
打印的不是传递的参数,而是定义的local array_one
和local array_two
在主函数中
您可以通过将代码更改为来看到这一点
function list_arrays {
# no variable definition
for ip in "${array_one[@]}"; do
echo "$ip"
done
for node in "${array_two[@]}"; do
echo "$node"
done
}
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
# no arguments passed
list_arrays
}
输出:
1
2
3
4
5
one
two
three
four
five
变量local _array_one=$1
和local _array_two=$2
根本没有在您的代码中真正使用。
当您重新定义变量时,如
function list_arrays {
local array_one=$1 # overwrites main's array_one
local array_two=$2 # overwrites main's array_two
for ip in "${array_one[@]}"; do
echo "$ip"
done
for node in "${array_two[@]}"; do
echo "$node"
done
}
function main {
local array_one=( 1 2 3 4 5 )
local array_two=( one two three four five )
# arguments passed are 1 2 3 4 5 one two three four five
list_arrays "${array_one[@]}" "${array_two[@]}"
}
nowarray_one
等于第一个参数1
和array_two
第二个参数 ,2
因此输出为
1
2