配列の要素を削除する方法

若干ハマったのでメモ。

bash で配列を使うにはこんな感じ。

declare -a aaa
aaa=('foo' 'bar' 'baz')
echo -n "# ${#aaa[@]} : "
declare -p aaa# 3 : declare -a aaa='([0]="foo" [1]="bar" [2]="baz")'

ほんで、bashで配列の要素を削除するにはunsetすればいい。

unset name[subscript] destroys the array element at index subscript.

http://www.linuxcommand.org/man_pages/bash1.html

でやってみると…

unset aaa[1]

echo -n "# ${#aaa[@]} : "
declare -p aaa# 2 : declare -a aaa='([0]="foo" [2]="baz")'

要素は無くなる([1]="bar"が無くなり、要素数も3から2になった)けど、インデックスは詰めてくれない([1]が欠番になってる)。

なので、こんなループがあると

i=0
while [ $i -lt ${#aaa[@]} ]; do
  echo "[$i]${aaa[$i]} "
  i=$(($i+1))
done[0]foo
[1]

[2]のbazが表示されないので注意。


インデックスを詰めるには代入し直せばOK。なんかイモいけど。

unset aaa[1]
aaa=(${aaa[@]})

echo -n "# ${#aaa[@]} : "
declare -p aaa# 2 : declare -a aaa='([0]="foo" [1]="baz")'

あわせて節みたい