Bash에서 색인을 지정하지 않고 배열에 새 요소 추가


답변:


1540

예 :

ARRAY=()
ARRAY+=('foo')
ARRAY+=('bar')

배쉬 참조 매뉴얼 :

대 입문이 쉘 변수 또는 배열 인덱스 (배열 참조)에 값을 할당하는 컨텍스트에서 '+ ='연산자를 사용하여 변수의 이전 값을 추가하거나 추가 할 수 있습니다.


21
이것은 bash 3.2.48 (OS X 10.8.2)에서 잘 작동합니다. 참고 ARRAY실제 변수 이름 바로 자리 표시 자입니다. 배열 인덱스가 순차적 이 아닌 경우에도 추가 +=하면 가장 높은 인덱스 + 1에 할당됩니다.
mklement0

3
bash 버전 4.2.24 (1)에 이와 비슷한 것이 있습니까?
Ali Ismayilov

195
ARRAY + = ( 'foo')는 ARRAY + = 'foo'와는 다른 점에 유의해야합니다. ARRAY + = 'foo'는 문자열 'foo'를 가장 낮은 (?) 키로 항목에 추가합니다.
생성자

8
wiki.bash-hackers.org/scripting/bashchanges 에 따르면 이 구문은 3.1-alpha1 버전에서 처음 나타났습니다.
David Yaw

39
@Jas : 전체 배열에 액세스하려면 ${myarray[@]}-스칼라 인 것처럼 배열 변수를 참조하는 것이 요소 0에 액세스하는 것과 동일합니다. 다른 말로 : $myarray와 같습니다 ${myarray[0]}.
mklement0

76

마찬가지로 멍청한 녀석이 지적, 그것은 제로의 배열이 시작 여부를주의하는 것이 중요하고 순차적입니다. 연속적이지 않은 인덱스에 할당하고 설정을 해제 할 수 있기 때문에 ${#array[@]}배열의 끝에서 항상 다음 항목이되는 것은 아닙니다.

$ array=(a b c d e f g h)
$ array[42]="i"
$ unset array[2]
$ unset array[3]
$ declare -p array     # dump the array so we can see what it contains
declare -a array='([0]="a" [1]="b" [4]="e" [5]="f" [6]="g" [7]="h" [42]="i")'
$ echo ${#array[@]}
7
$ echo ${array[${#array[@]}]}
h

마지막 색인을 얻는 방법은 다음과 같습니다.

$ end=(${!array[@]})   # put all the indices in an array
$ end=${end[@]: -1}    # get the last one
$ echo $end
42

배열의 마지막 요소를 얻는 방법을 보여줍니다. 당신은 종종 이것을 볼 것입니다 :

$ echo ${array[${#array[@]} - 1]}
g

보시다시피, 희소 배열을 다루기 때문에 이것이 마지막 요소가 아닙니다. 이것은 희소 배열과 연속 배열 모두에서 작동합니다.

$ echo ${array[@]: -1}
i

3
좋은 물건; 부분 문자열 추출 구문이 배열에도 적용될 수 있다는 것을 결코 알지 못했습니다. 시행 착오에 의해 결정된 규칙은 (bash 3.2.48) : ${array[@]: start[:count]}카운트 요소를 반환합니다. 또는 지정되지 않은 경우 나머지 모든 요소 . 다음 요소에서 시작 :-시작> = 0 인 경우 요소에서. 색인이> = start 인 경우 -시작 <0 인 경우 : 요소에서 인덱스가 (마지막 배열 인덱스 + 1) 인-abs (start); 주의 : abs (start)> (last array index + 1)이면 null 문자열이 반환됩니다. count가 지정되면 인덱스가 시작부터 연속적이지 않더라도 많은 요소가 리턴됩니다.
mklement0

3
@mklement : Bash 4.2에서는 음수 배열 첨자를 사용하여 배열 끝에서 계산 된 요소에 액세스 할 수 있습니다. ${array[-1]}
추후 공지가있을 때까지 일시 중지되었습니다.

감사합니다. OS X (10.8.2 현재)는 여전히 3.2.48을 사용하고 stackoverflow.com/questions/10418616/… 은 불행히도 "Apple은 라이센스가있는 코드를 제공하지 않기 때문에 꽤 오래된 Bash 버전을 사용합니다 GPL3 아래에 있습니다. "
mklement0

49
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest

8
+ = 연산자의 의미를 지원하지 않는 배시 버전 좋은 전자 t172하여 설명
akostadinov

12
이전 버전과 호환되는 좋은 솔루션이지만 기존 요소 중 하나에 공백이 있으면 여러 요소로 분할됩니다. arr=("${arr[@]}" "new")공백이있는 요소가있는 경우 사용
kbolino

1
이것은 또한 배열 앞에 밀어 넣는 데 사용될 수 있습니다.
Tomáš Zato-복원 모니카

29

배열이 항상 순차적이고 0에서 시작하는 경우 다음을 수행 할 수 있습니다.

array[${#array[@]}]='foo'

# gets the length of the array
${#array_name[@]}

실수로 등호 사이에 공백을 사용하는 경우 :

array[${#array[@]}] = 'foo'

그러면 다음과 유사한 오류가 나타납니다.

array_name[3]: command not found

5
예, 가능하지만 +=구문 (@ e-t172의 답변 참조)은 (a) 더 간단하며 (b) 연속적이지 않거나 0으로 시작하지 않는 배열에도 사용할 수 있습니다.
mklement0

솔직히이 솔루션 (나를 위해)은 "+ ="보다 더 잘 작동합니다. 후자는 길이가 때때로 잘못되기 때문에 (하나의 요소를 추가 할 때 2가 증가하기 때문에) ... 그래서이 회신을 선호합니다! :)
Pierpaolo Cira

이것은 이전 버전의 bash에서도 작동합니다 +=. 예 : 버전 2
Zoey Hewll

1
이것은 또한 요소에 공백이있을 때 작동 $arr += ($el)합니다. 문자열을 공백으로 나누고 각 요소를 추가하는 것처럼 보였습니다.
Max

5

인덱스 배열을 사용하면 다음과 같이 할 수 있습니다.

declare -a a=()
a+=('foo' 'bar')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.