Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What is going on with this article?
@pu_ri

bash で配列、連想配列をシェル関数の引数として渡す

More than 1 year has passed since last update.

本投稿について

説明すること

  • bash で declare コマンドを使用して配列や連想配列を宣言する方法
  • 配列や連想配列をシェル関数の引数として渡す方法

※declare による名前参照を使用するため bash 4.3 以降でしか動作しません。

説明しないこと

  • 配列や連想配列の細かい操作
  • 配列、連想配列、名前参照以外の declare コマンドの使用方法

使用するコマンド

ここでは declare コマンドを使用します。
declare は bash で変数を宣言したり、変数に属性を与えたりするためのコマンドです。
declare コマンドの使い方は man bash にて以下のように記載されています。

declare [-aAfFgilnrtux] [-p] [name[=value] ...]

ここで使用するオプションは以下のものです。

オプション 説明
-a 配列変数を宣言
-A 連想配列変数を宣言
-n 変数の名前参照を行う
-p 変数の属性と値の表示

配列変数、連想配列変数の宣言

bash で declare コマンドを使用することで配列変数や連想配列変数を宣言することができます。

配列変数の宣言

declare コマンドを使用して配列宣言をする場合は以下のようにします。

declare -a array=("1" "2" "3")

declare -p を使用すると変数の内容を表示できます。

declare -p array

結果は以下のように表示されます。

declare -a array=([0]="1" [1]="2" [2]="3")  

${array[@]} で配列の全要素が参照できます。

echo ${array[@]}

結果は以下のように表示されます。

1 2 3

連想配列の宣言

declare コマンドを使用して配列宣言をする場合は以下のようにします。

declare -A hash=(["a"]="A" ["b"]="B" ["c"]="C")

declare -p を使用すると変数の内容を表示できます。

declare -p hash

結果は以下のように表示されます。

declare -A hash=([a]="A" [b]="B" [c]="C" )

${hash[@]} で連想配列の全要素が参照できます。

echo ${hash[@]}

結果は以下のように表示されます。

A B C

${!hash[@]} で連想配列の全キーが参照できます。

echo ${!hash[@]}

結果は以下のように表示されます。

a b c

配列、連想配列をシェル関数の引数として渡す

シェル関数の引数はコマンドラインと同様の形式で渡されるらしく通常は配列や連想配列を引数として渡すことはできないようです。
ですが、シェル関数内で引数に対して declare -n を使用して名前参照することで引数に渡した配列や連想配列をシェル関数内で参照することが可能となります。

ここでは先ほど宣言した連想配列 hash を使用します。
※配列の場合は同様のため説明しません。

# 第1引数を連想配列として参照し各要素の値を表示する関数
print_hash_val()
{
        declare -n ref=$1
        for val in ${ref[@]};
        do
                echo "val = $val"
        done
}

# 連想配列変数を宣言
declare -A hash=(["a"]="A" ["b"]="B" ["c"]="C")

# シェル関数を呼び出して hash の各要素を表示
print_hash_val hash

結果は以下のように表示されます。

val = A
val = B
val = C
9
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
pu_ri
infra-workshop
インフラ技術を勉強したい人たちのためのオンライン勉強会です

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
9
Help us understand the problem. What is going on with this article?