아래 코드 조각에서 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
출력은 다음과 같습니다.
1
2