bash配列

# 概要

Bashの配列についていつも分からなくなるのでメモ的に作成。

## 配列を定義する

$#{ARRAY[@]}で配列を操作できる。

${ARRAY}だと先頭の要素がとれる。

```shell
ARRAY=(1 2 3 4 5)

echo "ARRAY=(1 2 3 4 5)"
echo "LENGTH=${#ARRAY[@]}"

echo "======================"
for ((i=0; i<${#ARRAY[@]}; i++))
do
  echo "\${ARRAY[$i]}=${ARRAY[$i]}"
done

echo "======================"
echo "\${ARRAY}=${ARRAY}"
```

結果

```shell
ARRAY=(1 2 3 4 5)
LENGTH=5
======================
${ARRAY[0]}=1
${ARRAY[1]}=2
${ARRAY[2]}=3
${ARRAY[3]}=4
${ARRAY[4]}=5
======================
${ARRAY}=1
```

## 配列の@と＊

配列変数を""で括ると@の場合は配列として扱い、*の場合は１つの文字列として扱う

```shell
ARRAY=(1 2 3 4 5)

echo "\${ARRAY[@]}=${ARRAY[@]}"
echo "\${ARRAY[*]}=${ARRAY[*]}"

echo "======================"
i=0
for X in "${ARRAY[@]}"
do
  echo "\${ARRAY[$i]}=$X"
  i=$(($i+1))
done

echo "======================"
for X in "${ARRAY[*]}"
do
  echo "\${ARRAY[$i]}=$X"
  i=$(($i+1))
done
```

結果

```shell
${ARRAY[@]}=1 2 3 4 5
${ARRAY[*]}=1 2 3 4 5
======================
${ARRAY[0]}=1
${ARRAY[1]}=2
${ARRAY[2]}=3
${ARRAY[3]}=4
${ARRAY[4]}=5
======================
${ARRAY[5]}=1 2 3 4 5
```


## 配列を関数の引数にする

引数全体を配列にする場合は@で指定する

```shell
ARRAY1=(1 2 3 4 5)

sub1() {
  SUB_ARRAY=$@
  
  echo "\${SUB_ARRAY[@]}=${SUB_ARRAY[@]}"
  echo "======================"
  for ((i=0; i<${#SUB_ARRAY[@]}; i++))
  do
    echo "\${SUB_ARRAY[$i]}=${SUB_ARRAY[$i]}"
  done
  echo "======================"
}

echo "sub1 \"\${ARRAY1[@]}\""
sub1 "${ARRAY1[@]}"

echo "sub1 \"\${ARRAY1[*]}\""
sub1 "${ARRAY1[*]}"
```

結果

```shell
sub1 "${ARRAY1[@]}"
${SUB_ARRAY[@]}=1 2 3 4 5
======================
${SUB_ARRAY[0]}=1 2 3 4 5
======================
sub1 "${ARRAY1[*]}"
${SUB_ARRAY[@]}=1 2 3 4 5
======================
${SUB_ARRAY[0]}=1 2 3 4 5
======================
```

１つめの引数に配列を指定する場合は*で指定して""で括る


```shell
ARRAY1=(1 2 3 4 5)

sub2() {
  SUB_ARRAY=($1)
  ARG2=$2
  
  echo "\${SUB_ARRAY[@]}=${SUB_ARRAY[@]}"
  echo "======================"
  for ((i=0; i<${#SUB_ARRAY[@]}; i++))
  do
    echo "\${SUB_ARRAY[$i]}=${SUB_ARRAY[$i]}"
  done
  echo "======================"
  echo "\$ARG2=${ARG2}"
}

echo "sub2 \"\${ARRAY1[@]}\" arg2"
sub2 "${ARRAY1[@]}" arg2

echo "sub2 \"\${ARRAY1[*]}\" arg2"
sub2 "${ARRAY1[*]}" arg2
```

結果

```shell
sub2 "${ARRAY1[@]}" arg2
${SUB_ARRAY[@]}=1
======================
${SUB_ARRAY[0]}=1
======================
$ARG2=2
sub2 "${ARRAY1[*]}" arg2
${SUB_ARRAY[@]}=1 2 3 4 5
======================
${SUB_ARRAY[0]}=1
${SUB_ARRAY[1]}=2
${SUB_ARRAY[2]}=3
${SUB_ARRAY[3]}=4
${SUB_ARRAY[4]}=5
======================
$ARG2=arg2
```

配列を引数１と引数２に渡すこともできる。

```
ARRAY1=(1 2 3 4 5)
ARRAY2=(a b c d e)

sub2() {
  SUB_ARRAY1=($1)
  SUB_ARRAY2=($2)
  
  echo "\${SUB_ARRAY1[@]}=${SUB_ARRAY1[@]}"
  echo "======================"
  for ((i=0; i<${#SUB_ARRAY1[@]}; i++))
  do
    echo "\${SUB_ARRAY1[$i]}=${SUB_ARRAY1[$i]}"
  done
  echo "======================"
  echo "\${SUB_ARRAY2[@]}=${SUB_ARRAY2[@]}"
  echo "======================"
  for ((i=0; i<${#SUB_ARRAY2[@]}; i++))
  do
    echo "\${SUB_ARRAY2[$i]}=${SUB_ARRAY2[$i]}"
  done
  echo "======================"
}

echo "sub2 \"\${ARRAY1[*]}\" \"\${ARRAY2[*]}\""
sub2 "${ARRAY1[*]}" "${ARRAY2[*]}"
```

### 結果

```shell
sub2 "${ARRAY1[*]}" "${ARRAY2[*]}"
${SUB_ARRAY1[@]}=1 2 3 4 5
======================
${SUB_ARRAY1[0]}=1
${SUB_ARRAY1[1]}=2
${SUB_ARRAY1[2]}=3
${SUB_ARRAY1[3]}=4
${SUB_ARRAY1[4]}=5
======================
${SUB_ARRAY2[@]}=a b c d e
======================
${SUB_ARRAY2[0]}=a
${SUB_ARRAY2[1]}=b
${SUB_ARRAY2[2]}=c
${SUB_ARRAY2[3]}=d
${SUB_ARRAY2[4]}=e
======================
```

## ２重配列 その１

個々の配列を宣言しMAIN_ARRAYには変数名を設定している。
!で変数名から変数を取得して、:N番目:N個で配列の値を取得している。

```shell
ARRAY1=(1 2 3 4 5)
ARRAY2=(a b c d e)
MAIN_ARRAY=(ARRAY1[@] ARRAY2[@])

echo ${MAIN_ARRAY[@]}

for ((i=0; i<${#MAIN_ARRAY[@]}; i++))
do
  echo ${MAIN_ARRAY[i]}
  echo ${!MAIN_ARRAY[i]}
  for ((j=0; j<5; j++))
  do
    echo ${!MAIN_ARRAY[i]:j:1}
  done
done
```

結果

```shell
ARRAY1[@] ARRAY2[@]
ARRAY1[@]
1 2 3 4 5
1
2
3
4
5
ARRAY2[@]
a b c d e
a
b
c
d
e
```

## ２重配列 その２

個々の配列を定義してMAIN_ARRAYには配列を文字列として指定している。

```shell
ARRAY1=(1 2 3 4 5)
ARRAY2=(a b c d e)
MAIN_ARRAY=("${ARRAY1[*]}" "${ARRAY2[*]}")

echo ${MAIN_ARRAY[@]}

for ((i=0; i<${#MAIN_ARRAY[@]}; i++))
do
  echo "\${MAIN_ARRAY[$i]}=${MAIN_ARRAY[i]}"
  SUB_ARRAY=(${MAIN_ARRAY[i]})
  for ((j=0; j<5; j++))
  do
    echo "\${SUB_ARRAY[$j]}=${SUB_ARRAY[j]}"
  done
done
```

結果

```shell
1 2 3 4 5 a b c d e
${MAIN_ARRAY[0]}=1 2 3 4 5
${SUB_ARRAY[0]}=1
${SUB_ARRAY[1]}=2
${SUB_ARRAY[2]}=3
${SUB_ARRAY[3]}=4
${SUB_ARRAY[4]}=5
${MAIN_ARRAY[1]}=a b c d e
${SUB_ARRAY[0]}=a
${SUB_ARRAY[1]}=b
${SUB_ARRAY[2]}=c
${SUB_ARRAY[3]}=d
${SUB_ARRAY[4]}=e
```