Bash에서 배열로 작업하고 있는데 특정 배열 하나가 이상하게 동작합니다.
함수를 사용하고 다음과 같이 배열에 추가할 값을 반환하는 외부 스크립트를 호출하고 있습니다.
function get_unit_coverage() {
for sub_unit in "$@"
do
extracted_value=$( ./external_script.sh $file $sub_unit )
my_array+=$extracted_value
done
}
함수에 배열을 전달하고 각 반복마다 배열이 추가될 것으로 예상합니다.
그러나 다음을 반환합니다.
echo "${my_Array[0]}"
예
52.5500%66.6400%16.4300%47.8800%40.6600%45.6800%43.3400%74.5100%87.4600%45.6300%65.6100%58.0900%%47.5800%5.9500%7.6500%1.8000%
external_script.sh는 단지 값을 반영합니다. 이것이 잠재적인 문제입니까?
답변1
배열에 새 요소를 추가하려면:
array+=( new elements here )
귀하의 경우:
my_array+=( "$extracted_value" )
당신이 할 때
array+=$variable
배열의 첫 번째 요소에 추가하려고 합니다. 그것은 동일합니다
array[0]+=$variable
또한
extracted_value=$( ./external_script.sh $file $sub_unit )
값은 $file
공백 $sub_unit
과 파일 이름 글로빙으로 분할됩니다. 이를 방지하려면 대신 "$file"
에 및를 사용하십시오 "$sub_unit"
(즉, 큰따옴표를 사용한 인용 변수 확장).
마찬가지로 말하자면
my_array+=( $extracted_value )
값을 여러 단어로 분할 $extracted_value
하고 각 단어는 배열에 새 요소를 생성하기 위해 파일 이름 글로빙이 됩니다. (이미 언급했듯이) 이렇게 작성하는 것이 더 좋을 것입니다.
my_array+=( "$extracted_value" )
이것은 일반적인 조언이므로 그렇게 할 이유가 없습니다.아니요당신이 여부에 관계없이 이것을 수행하십시오알다귀하의 값은 이미 와일드카드 문자가 없는 단일 단어입니다.
답변2
문자열에 추가하고 배열로 읽습니다(Kusalananda가 위에서 설명한 것처럼). 그러나 귀하의 질문은 변수를 배열로 처리하는 방법을 보여줍니다. 실제로 간단한 변수는 쉽게 배열로 변환될 수 있습니다.
$ a+=1
$ a+=2
$ echo "$a"
12
$ echo "${a[0]}"
12
$ a+=(3)
$ echo "$a"
12
$ echo "${a[0]}"
12
$ echo "${a[1]}"
3