
以下のコードスニペットでは、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[@]}"
}
渡されたパラメータは2つの配列ではありません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[@]}"
}
これで、array_one
最初のパラメータ1
とarray_two
2番目のパラメータと同じなので、2
出力は次のようになります。
1
2