web-dev-qa-db-ja.com

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

いくつかの要素を含む配列がありますが、新しい項目を配列の先頭にプッシュします。それ、どうやったら出来るの?

65
Gaurav KS

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

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. インデックス位置2の前のすべての要素を取得しますarr [0]およびarr [1];
  2. 配列に要素を追加します。
  3. 最後のインデックス位置2を持つすべての要素を取得しますarr [2]arr [3]、....

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

配列から要素を削除する

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

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

    そこからelement#3(arr [2])を除外してarrを再構築する1つの可能な方法:

    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[@]}"
85
αғsнιη

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")

それが、そのための組み込み演算子がない理由を説明しています。

newvalue${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
    
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  
}
1
Mahendra

インデックス付き配列の作成:

$ declare -a A
$ declare -p A

宣言-a A

配列に要素を追加します:

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

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

中央の要素を削除して、スパースインデックス配列にします:

$ unset A[1]
$ declare -p A

declare -a A =([0] = "foo" [2] = "baz quux")

疎インデックス配列から最後の要素を削除します:

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

宣言-a A =([0] = "foo")

0
Wil