web-dev-qa-db-ja.com

Bashでインデックスを指定せずに配列に新しい要素を追加する

PHPの$array[] = 'foo';のような何かをbashでやる方法はありますか:

array[0] = 'foo'
array[1] = 'bar'
659
Darryl Hein

はいあります:

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

Bashリファレンスマニュアル

代入文がシェル変数または配列インデックスに値を代入している状況では(配列を参照)、 '+ ='演算子を使用して変数の前の値に追加または追加することができます。

1299

Dumb Guy が指摘するように、配列がゼロから始まりシーケンシャルであるかどうかに注意することが重要です。連続していないインデックスに代入したり設定解除したりできるので、${#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
67
$ declare -a arr
$ arr=("a")
$ arr=("${arr[@]}" "new")
$ echo ${arr[@]}
a new
$ arr=("${arr[@]}" "newest")
$ echo ${arr[@]}
a new newest
43
ghostdog74

配列が常にシーケンシャルで0から始まる場合は、次のようにします。

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

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

誤って等号の間にスペースを入れた場合

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

その後、次のようなエラーが表示されます。

array_name[3]: command not found
22
Dumb Guy

インデックス付き配列では、次のようにすることができます。

declare -a a=()
a+=('foo' 'bar')
5
Grégory Roche