【Shell】シェル ~ 基本編 / 配列 ~

■ はじめに

シェルの配列に関して、まとめておく。

目次

【0】シェルの配列種類
【1】配列 - リスト
 1)定義方法
 2)要素の追加
 3)要素の削除
 4)関数の引数・戻り値
 5)配列のソート
【2】連想配列 - ディクショナリ

【0】シェルの配列種類

シェルの"配列" には、以下の2種類がある

【1】配列 - リスト
【2】連想配列 - ディクショナリ

【1】配列 - リスト

* 配列(Arrays)
 => Python/javaでいう List型

1)定義方法

* 「declare -a <配列名>」で定義する。
 => -a : 配列 arrayを意味している

補足:declare について

* 詳細は、以下のサイトを参照のこと

https://atmarkit.itmedia.co.jp/ait/articles/1905/30/news017.html

サンプル

declare -a array=(
  "Hello"
  "World"
  "!!!"
)

for value in ${array[@]};
do
  echo "Result ${value}"
done

# 出力結果
#
# $ ./sample.sh
# Result Hello
# Result World
# Result !!!

2)要素の追加

* 「array+=("追加する値")」で追加する

サンプル

#!/bin/bash

local array=()
array+=("Hello")
array+=("World")
array+=("!!!")

for value in ${array[@]}; do
  echo ${value}
done

# [出力結果]
# $ ./sample.sh
# Hello
# World
# !!!

3)要素の削除

* 「unset array[1]」で削除する

サンプル

#!/bin/bash

local array=()
array+=("Hello")
array+=("World")
array+=("!!!")

# Remove
unset array[1]

for value in ${array[@]}; do
  echo ${value}
done

4)関数の引数・戻り値

* 引数の場合は、「shift」を使う
 => 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/07/11/000421

* 戻り値の場合、「echo ${return_values[@]}」のように返し
 「results=(`func`)」のように受け取る
 => 以下のサイトが参考になる。

http://labs.opentone.co.jp/?p=5890

サンプル

#!/bin/bash

function sample_function() {
  local value1=${1}
  shift
  local values2=($@)
 
  local return_values=(${value1})
  for value in ${values2[@]}; do
    return_values+=(${value})
  done
 
  echo ${return_values[@]}
}

arg_value="Hi"
arg_array=("Hello" "World" "!!!")
 
results=(`sample_function ${arg_value} ${arg_array[@]}`)
 
for result in ${results[@]}
do
  echo ${result}
done

# [出力結果]
# $ ./sample.sh
# Hi
# Hello
# World
# !!!

5)配列のソート

* 以下のサンプルのように「sort」コマンドを使う
 => 「sort」コマンド については、以下のサイトを参照。

https://atmarkit.itmedia.co.jp/ait/articles/1611/09/news020.html

サンプル

#!/bin/bash

sorted_file_list=(`for sql_file in ./*.sql; do echo "$sql_file"; done | sort`)
for target_file_path in ${sorted_file_list[@]}; do
  echo "target_file_path = ${target_file_path}"
done

# [出力例]
# target_file_path = ./sample.sql
# target_file_path = ./sample_ex1.sql
# target_file_path = ./sample_ex2.sql
# target_file_path = ./sample_ex3.sql

echo "*************"

# 逆順 -r
sorted_file_list=(`for sql_file in ./*.sql; do echo "$sql_file"; done | sort -r`)
for target_file_path in ${sorted_file_list[@]}; do
  echo "target_file_path = ${target_file_path}"
done

# [出力例]
# target_file_path = ./sample_ex3.sql
# target_file_path = ./sample_ex2.sql
# target_file_path = ./sample_ex1.sql
# target_file_path = ./sample.sql

【2】連想配列 - ディクショナリ

* 連想配列(Associative arrays)
 => Pythonでいうdict。JavaでいうMapみたいなキー・値型
 => 詳細は以下の関連記事を参照。

シェル ~ 基本編 / 連想配列 - ディクショナリ ~
https://dk521123.hatenablog.com/entry/2021/09/11/000000

参考文献

https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59
https://atmarkit.itmedia.co.jp/ait/articles/1905/22/news004.html

関連記事

シェル ~入門編~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
シェル ~ 基本編 / 連想配列 - ディクショナリ ~
https://dk521123.hatenablog.com/entry/2021/09/11/000000
シェル ~ 基本編・構文全般 ~
https://dk521123.hatenablog.com/entry/2015/02/20/001600
シェル ~ 基本編・条件分岐 if / case ~
https://dk521123.hatenablog.com/entry/2015/05/01/000043
シェル ~ 基本編・関数 ~
https://dk521123.hatenablog.com/entry/2015/03/17/233124
シェル ~ 基本編・引数あれこれ ~
https://dk521123.hatenablog.com/entry/2021/07/11/000421
シェルで部分一致(前方一致・後方一致)
https://dk521123.hatenablog.com/entry/2020/09/01/000000