「シェルスクリプトの基礎 - 配列」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
152行目: 152行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
== 連想配列 ==
連想配列の定義は、<code>declare -A <配列名></code>と記述する。<br>
例えば、連想配列arrayを定義する場合は、<code>declare -A array</code>と記述する。<br>
<br>
通常の配列は、<code>declare -a <配列名></code>と記述する。通常の変数は、<code>declare <変数名></code>とする。<br>
<br>
連想配列の値は、<code>連想配列名[キー]=値<code>と記述する。
例えば、連想配列arrayにおいて、キーhogeに値10を代入する場合、<code>array["hoge"]=10</code>と記述する。
引用符""を省略して、<code>array[hoge]=10</code>と記述してもよい。
値の参照は、通常の配列と同様に<code>${array["hoge"]}</code>と記述する。ここでも、引用符""は省略できる。
for ~ in」で配列の値を全て参照したい場合も、通常の配列同様、「for 変数名 in ${配列名[@]}」のようにします。
 全てのキーの値を参照したい場合は、配列名の前に「!」記号を付けて、「for 変数名 in ${!配列名[@]}」のようにします。
 以下のサンプルスクリプト(arraytest)では、連想配列「exam」を定義し、suzuki、tanaka、yamamotoの点数を保存しています。そして、1つ目のfor文では全員の点数を順次表示し、2つ目のfor文では全員の名前と点数(キーと値)を表示しています。なお、サンプルスクリプトでは、suzukiが連想配列のキーであることを分かりやすくするために、キーに引用符を使用しています。
<syntaxhighlight lang="sh">
#!/bin/sh
declare -A array
array["hoge"]=10
array["piyo"]=20
array["fuga"]=30
for e in ${exam[@]}
do
    echo $e
done
for k in ${!exam[@]}
do
  echo "key  : $k"
  echo "value: ${exam[$k]}"
done


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]

2020年11月17日 (火) 16:55時点における版

概要

シェルスクリプトにおいて、配列を使用する方法を記載する。


配列の定義

配列を定義するには、以下のように記述する。

 array[0]=a
 array[1]=b
 array[2]=c


または、以下のように記述する。

 array=(a b c)



配列の基本

以下の例では、0〜3番目(2番目を除く)までの要素の配列を定義した後、各要素と配列全体を出力している。

 #!/bin/sh
 
 array[0]=a
 array[1]=b
 array[3]=d
 
 # 0番目の要素を参照する
 echo "$array"
 
 # 1番目の要素を参照する
 echo "$array[1]"
 
 # 2番目の要素は存在しないので空文字となる
 echo "$array[2]" 
 
 # 3番目の要素を参照する
 echo "$array[3]"
 
 # 全要素を参照する
 echo "$array[@]"
 
 # 出力
 a
 b
 
 d
 a b d



配列の要素の追加

配列に要素を追加する場合、新たな添字を指定して値を代入する。
また、配列に配列を追加する場合、+=を使用して配列名+=(値 値 値...)のように記述する。

 #!/bin/bash
 
 array=(a b c d)
 
 # 配列arrayの4番目の要素に代入
 array[4]=e
 
 # 配列arrayの末尾に要素を代入
 array+=(f g)
 
 # 配列arrayの末尾に要素を代入(ただし、添字が0から1ずつ値が存在する場合のみ可能)
 array[${#array[@]}]=h
 
 for i in ${!array[@]}
 do
    echo $i ${array[$i]}
 done
 
 # 出力
 a
 b
 c
 d
 e
 f
 g
 h



配列の要素の削除

以下の例では、配列を定義した後、unsetコマンドにより0番目の要素を削除している。

 #!/bin/sh
 
 array[0]=a
 array[1]=b
 
 unset array[0]
 
 echo "$array[@]"
 
 # 出力
 b



配列の表示

配列の要素数を表示するには、${#変数名[@]}を使用する。

 #!/bin/sh
 
 array=(a b c d)
 
 echo "${#array[@]}"
 
 # 出力
 4



配列と繰り返し

以下の例では、括弧()を使用して配列を定義した後、for文を使用して配列の要素を出力している。

 #!/bin/sh
 
 array=(a b c d)
 
 for e in $array[@]
 do
    echo "element = $e"
 done
 
 # 出力
 element = a
 element = b
 element = c
 element = d


また、以下のように記述することもできる。

 #!/bin/sh
 
 array=(a b c d)
 
 for ((i=0; i<${#array[@]}; i++))
 do
    echo "element = $array[i]"
 done
 
 # 出力
 element = a
 element = b
 element = c
 element = d



連想配列

連想配列の定義は、declare -A <配列名>と記述する。
例えば、連想配列arrayを定義する場合は、declare -A arrayと記述する。

通常の配列は、declare -a <配列名>と記述する。通常の変数は、declare <変数名>とする。

連想配列の値は、連想配列名[キー]=値と記述する。 例えば、連想配列arrayにおいて、キーhogeに値10を代入する場合、array["hoge"]=10と記述する。 引用符""を省略して、array[hoge]=10と記述してもよい。

値の参照は、通常の配列と同様に${array["hoge"]}と記述する。ここでも、引用符""は省略できる。 for ~ in」で配列の値を全て参照したい場合も、通常の配列同様、「for 変数名 in ${配列名[@]}」のようにします。


 全てのキーの値を参照したい場合は、配列名の前に「!」記号を付けて、「for 変数名 in ${!配列名[@]}」のようにします。

 以下のサンプルスクリプト(arraytest)では、連想配列「exam」を定義し、suzuki、tanaka、yamamotoの点数を保存しています。そして、1つ目のfor文では全員の点数を順次表示し、2つ目のfor文では全員の名前と点数(キーと値)を表示しています。なお、サンプルスクリプトでは、suzukiが連想配列のキーであることを分かりやすくするために、キーに引用符を使用しています。

<syntaxhighlight lang="sh">
#!/bin/sh

declare -A array
array["hoge"]=10
array["piyo"]=20
array["fuga"]=30

for e in ${exam[@]} 
do 
   echo $e
done

for k in ${!exam[@]} do

 echo "key  : $k"
 echo "value: ${exam[$k]}"

done