bash의 배열에 요소를 추가하거나 제거하는 방법은 무엇입니까?


답변:


47

배열의 시작 부분에 요소를 추가하려면 사용하십시오.

arr=("new_element" "${arr[@]}")

일반적으로 그렇습니다.

arr=("new_element1" "new_element2" "..." "new_elementN" "${arr[@]}")

배열 끝에 요소를 추가하려면 사용하십시오.

arr=( "${arr[@]}" "new_element" )

또는 대신

arr+=( "new_element" )

일반적으로 그렇습니다.

arr=( "${arr[@]}" "new_element1" "new_element2" "..." "new_elementN") #Or
arr+=( "new_element1" "new_element2" "..." "new_elementN" )

배열의 특정 인덱스에 요소를 추가하려면 사용하십시오.

Index2 arr [2] 의 위치에 요소를 추가한다고 가정 하면 실제로 하위 배열 아래에서 병합을 수행합니다.

  1. Index position2 arr [0]arr [1] 이전의 모든 요소를 ​​가져 옵니다 .
  2. 배열에 요소를 추가하십시오.
  3. 인덱스 위치가 2 인 모든 요소를 ​​마지막 arr [2] , arr [3] , ... 로 가져옵니다 .

    arr=( "${arr[@]:0:2}" "new_element" "${arr[@]:2}" )

배열에서 요소 제거

배열 (요소 # 2)에서 요소를 제거하는 것 외에도 두 개의 하위 배열을 연결해야합니다. 첫 번째 하위 배열은 요소 # 2 앞에 요소를 보유하고 두 번째 하위 배열은 요소 # 2 뒤에 요소를 포함합니다.

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}얻을 두 요소 [0], 언[1], 언 어레이의 처음부터 시작한다.
  • ${arr[@]:3}index3 arr [3] 에서 마지막 요소까지 모든 요소를 ​​가져옵니다 .

요소를 제거하는 또 다른 가능성은

  1. 사용 unset(실제로 'null'값을 요소에 지정)

    unset arr[2]
  2. 요소의 가치를 알고 있다면 바꾸기 패턴을 사용하십시오.

    arr=( "${arr[@]/PATTERN/}" )

2
제외합니다 arr+=(element)unset arr[2](이해야한다 unset -v 'arr[2]'!), 비 스파 스 배열을 가정합니다. 또한 arr=( "${arr[@]/PATTERN/}" )요소 수는 변경되지 않습니다. 빈 문자열로 바꾸면됩니다.
Stéphane Chazelas

제거 부분이 작동하려면 인덱스를 찾아야합니다. 가장 빠른 방법은 무엇입니까?
qodeninja

3

에서 그 배열 주 bash(KSH에서 복사)이 아니라 연관 배열됩니다.

a=(newvalue "$a[@]")

키와 숫자 키 1, 2를 사용하여 원래 배열의 요소 $anewvalueas를 사용하여 새 배열을 만듭니다 ${a[0]}.

예를 들어 다음과 같은 경우

bash-4.4$ typeset -p a
declare -a a=([0]="foo" [12]="bar")
bash-4.4$ a=(newvalue "${a[@]}")
bash-4.4$ typeset -p a
declare -a a=([0]="newvalue" [1]="foo" [2]="bar")

내장 연산자가없는 이유를 설명합니다.

newvalueas 를 삽입하고 ${a[0]}다른 모든 키를 하나씩 바꾸려면 임시 배열이 필요합니다.

b=newvalue
for k in "${!a[@]}"; do
  b[k+1]=${a[k]}
done
unset a
for k in "${!b[@]}"; do
  a[k]=${b[k]}
done
unset b

일반 배열이 zsh있거나 비슷한 쉘에는 다음과 같은 yash연산자가 있습니다.

  • zsh:

    a[1,0]=newvalue

    (문자열을 스칼라 변수 앞에 추가하는 경우에도 작동)

  • yash:

    array -i a 0 newvalue

"bash의 배열 (ksh에서 복사)은 오히려 연관 배열입니다." 나는 bash에 "정규"(아마도 희소) 및 연관 (문자열을 부정으로 사용할 수있는) 배열이 있다고 생각했는데 무엇을 놓치고 있습니까?
nhed

0
# array declaration  
arr=()  

#Function to read data from file a and add into array  
fun_add_in_array()
{  
input=$1  
while IFS=',' read -r f1 f2  
do  
    echo "Element1 : $f1"  
    echo "Element2 : $f2"  
    arr+=( "$f1" )  
done < "$input"  
}  

#Function to print a array  
fun_read_array()  
{  
arr=("$@")  
for i in "${arr[@]}"  
do  
    echo $i  
done  
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.