bashの配列に要素を追加/削除する方法は?


回答:


48

配列の先頭に要素を追加するには、を使用します。

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. Index position2から最後のarr [2]arr [3]、... までのすべての要素を取得します。

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

配列から要素を削除する

配列から要素を削除することに加えて(要素#2としましょう)、2つのサブ配列を連結する必要があります。最初のサブ配列には要素#2の前の要素が保持され、2番目のサブ配列には要素#2の後の要素が含まれます。

arr=( "${arr[@]:0:2}" "${arr[@]:3}" )
  • ${arr[@]:0:2}2つの要素arr [0]を取得し、arr [1]は配列の先頭から始まります。
  • ${arr[@]:3}index3 arr [3] から最後までのすべての要素を取得します。

要素を削除する別の可能性は

  1. 使用unset(要素に「null」値を実際に割り当てます)

    unset arr[2]
  2. 要素の値がわかっている場合は、置換パターンを使用します。

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

2
arr+=(element)and unset arr[2](これはunset -v 'arr[2]'!でなければなりません)を除いて、スパースではない配列を想定していることに注意してください。また、arr=( "${arr[@]/PATTERN/}" )は要素の数を変更しないことに注意してください。できることは、それらを空の文字列に置き換えることだけです。
ステファンシャゼラス

削除する部分が機能するためには、インデックスを見つける必要がありますよね?それを見つけるための最速の方法は何ですか?
qodeninja

3

bash(kshからコピーされた)の配列は、むしろ連想配列であることに注意してください。

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

新たになるだろう$aとのアレイnewvalueとして${a[0]}、およびキー1,2とのキーの番号順に添付元の配列の要素を...

たとえば、次の場合:

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]}、他のすべてのキーを1つずつシフトする場合は、一時配列が必要です。

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

通常の配列のようなシェルにはzshyashそのための演算子があります:

  • zsh

    a[1,0]=newvalue

    (文字列をスカラー変数に追加する場合にも機能します)

  • yash

    array -i a 0 newvalue

1
「bashの配列(kshからコピー)はかなり連想配列です」?? bashには「通常の」配列(おそらくスパース)と連想配列(文字列をインデックスとして使用できる)があると思いましたが、何が欠けていますか?
20:11の

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.