Bash에서 배열에 요소를 추가/제거하는 방법은 무엇입니까?

Bash에서 배열에 요소를 추가/제거하는 방법은 무엇입니까?

일부 요소가 포함된 배열이 있지만 새 항목을 배열의 시작 부분에 푸시하고 싶습니다. 어떻게 해야 합니까?

답변1

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

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 위치에 요소를 추가한다고 가정해 보겠습니다.도착[2], 실제로 다음 하위 배열을 병합합니다.

  1. Indexposition2 이전의 모든 요소 가져오기도착[0]그리고도착[1];
  2. 배열에 요소를 추가합니다.
  3. 인덱스 위치 2부터 끝까지 모든 요소를 ​​가져옵니다.도착[2],도착[3], ....

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

배열에서 요소 제거

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

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}두 가지 요소를 얻을 것입니다도착[0]그리고도착[1]배열의 시작 부분부터 시작합니다.
  • ${arr[@]:3}index3에서 모든 요소를 ​​​​가져옵니다.도착[3] 끝까지.

    가능한 편리한 방법은 요소#3(arr[2])을 제외하고 arr을 다시 빌드하는 것입니다.

    del_element=3; arr=( "${arr[@]:0:$((del_element-1))}" "${arr[@]:$del_element}" )
    

    에서 제외할 요소를 지정합니다 del_element=.

요소를 제거하는 또 다른 방법은 다음과 같습니다.

  1. 사용 unset(실제로 요소에 "null" 값 할당)

    unset -v 'arr[2]'
    
  2. 배열 요소의 값을 알고 있는 경우 바꾸기 모드를 사용하여 값을 자릅니다(빈 문자열로 바꿉니다).

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

인쇄 배열

printf '%s\n' "${arr[@]}"

답변2

ksh에서 복사된 배열은 bash상당히 연관 배열입니다(키는 양의 정수로 제한됩니다.희소 배열).

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

as를 사용하여 새 배열이 생성되고 $a원래 배열의 요소가 키 번호 순서대로 키 1, 2...에 추가됩니다.newvalue${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
    

답변3

# 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  
}

답변4

인덱스 배열 생성:

$ declare -a A
$ declare -p A

명령문 -a A

배열에 일부 요소를 추가합니다.

$ A+=(foo)
$ A+=(bar)
$ A+=("baz quux")
$ declare -p A

명령문 -a A=([0]="foo" [1]="bar" [2]="baz quux")

중간 요소를 제거하여 인덱스가 희박한 배열로 만듭니다.

$ unset A[1]
$ declare -p A

명령문 -a A=([0]="foo" [2]="baz quux")

드물게 인덱스된 배열에서 마지막 요소를 제거합니다.

$ unset A[-1]
$ declare -p A

명령문 -a A=([0]="foo")

관련 정보