변수에 배열을 할당할 때의 단점은 다음과 같습니다. array2=("${array1[@]}")

변수에 배열을 할당할 때의 단점은 다음과 같습니다. array2=("${array1[@]}")

다음과 같이 한 배열을 다른 배열로 복사할 수 있습니다.

array2=("${array1[@]}")

이 접근 방식의 한 가지 단점은 인덱스가 보존되지 않는다는 것입니다. 예를 들어, 합계 인덱스가 있는 세 개의 요소가 있는 경우 array1인덱스 합계와 합계를 갖게 됩니다.125array2123

다른 단점이 있나요?

답변1

글쎄, "${array[@]}"그것은 배열의 값을 제공하고 그게 전부입니다. 나는 이것이 문제가 될 것이라고 생각하지 않습니다.

그러나 언급한 대로 인덱스나 기타 속성과 같은 값 외에는 아무것도 제공하지 않습니다. Bash 배열은 읽기 전용이거나 정수 또는 대문자/소문자 속성을 가질 수 있습니다. 물론 연관 배열의 경우에도 마찬가지입니다. 해당 할당의 결과는 일반 인덱스 배열이 되지만 인덱스를 잃는 것은 더 큰 문제입니다. 속성은 간단할 수 있으며 배열에 어떤 속성이 설정되어 있는지 알 수 있습니다.

이와 같은 할당은 array2=("${array1[@]}")원래 값을 모두 제거하므로 array2나머지 데이터에는 문제가 없습니다. 그러나 속성은 array2유지되며 정수 배열로 설정된 경우 해당 값은 array2산술 표현식으로 처리됩니다. ( 와 동일하게 a="1 + 3"; declare -i b=$a; echo $b"4"를 인쇄합니다.)

인덱스도 복사하려면 루프를 사용해야 하며 속성을 수동으로 설정해야 합니다.

# declare -A arr2    # if it was an associative array
arr2=()              # clear the target
for k in "${!arr[@]}" ; do arr2[$k]=${arr[$k]} ; done 

또는 정확한 복사본, 속성 및 모든 것을 얻으려면 의 출력을 declare -p 셸에 대한 입력으로 사용할 수 있으므로 모든 키와 속성을 ai1복사 해야 합니다.ai2

declare -Ai ai1=([foo]=123 [$'a tricky key\n']=456)
definition=$(declare -p ai1)
eval "${definition/ ai1/ ai2}"

${var/pat/repl}문자열 작업은 모든 값에 대한 작업 과 유사합니다 . 나는 이것에 대해 다른 문제가 있어서는 안 된다고 생각합니다. 패턴의 별표가 가장 긴 일치 항목과 함께 잘못 배치되었다고 생각하지만 ${var/pat/repl}전체 값이 지워집니다.${var##pat}"${var/#prefix*/}"

당신이 원하는 것은 아마도 것 "${myArray[@]#unwanted-prefix}"입니다.

관련 정보