Loose-Info.com
Last Update 2022/07/25
TOP - 各種テスト - bash - 配列

配列


テスト項目

(01) 宣言・代入

(02) 属性指定

(03) 配列要素の参照

(04) 配列の要素数

(05) 配列の削除・破棄


(01) 宣言・代入


実行結果(1)
$ declare -a sample1 <--- 組み込みコマンドdeclare -aによるインデックス配列の明示的宣言 $ declare -p sample1 <--- declare -pにより配列sample1の情報を出力 declare -a sample1 <--- 配列sample1に関する情報 $ sample1=(a b c) <--- sample1への値の代入 $ declare -p sample1 declare -a sample1=([0]="a" [1]="b" [2]="c") <--- 配列sample1に関する情報

実行結果(2)
$ declare -A sample2=(key1 "value1" key2 "value2") <--- 連想配列の明示的宣言と代入を同時に実行 $ declare -p sample2 declare -A sample2=([key2]="value2" [key1]="value1" ) <--- 配列sample2に関する情報 $ echo ${sample2[key2]} <--- キー「key2」に対応する値を出力 value2

実行結果(3)
$ sample3=(d e f) <--- declareを使用せずに配列を生成 $ declare -p sample3 declare -a sample3=([0]="d" [1]="e" [2]="f") <--- インデックス配列として生成される $ declare -A sample4=([key1]="value1" [key2]="value2") <--- 連想配列の明示的宣言して生成 $ declare -p sample4 declare -A sample4=([key2]="value2" [key1]="value1" ) $ sample5=([key1]="value1" [key2]="value2") <--- 連想配列生成時の式にてdeclareを使用せずに代入 $ declare -p sample5 declare -a sample5=([0]="value2") <--- 連想配列とはならない

(02) 属性指定


実行結果(1)
$ declare -a sample1=(1 2 3) $ readonly sample1 <--- 読み込み専用属性の設定 $ declare -p sample1 declare -ar sample1=([0]="1" [1]="2" [2]="3") <--- -rオプション設定済み $ sample1[0]=4 bash: sample1: readonly variable <--- 読み込み専用のため代入不可 $ unset sample1 bash: unset: sample1: cannot unset: readonly variable <--- unset不可 $ exit <--- ログアウト exit $ su testusr <--- 再ログイン Password: $ declare -p sample1 bash: declare: sample1: not found <--- 再ログインにより配列変数sample1はリセットされる

実行結果(2)
$ declare -ai sample2=(1 2 3) <--- 整数属性の配列変数を生成 $ declare -p sample2 declare -ai sample2=([0]="1" [1]="2" [2]="3") <--- 各々の要素に整数値を格納 $ sample2=("a" "b" "c") <--- 各要素に文字を代入 $ declare -p sample2 declare -ai sample2=([0]="0" [1]="0" [2]="0") <--- 代入不可のため「0」となる $ sample2=("4" "5" "6") <--- 引用符を伴った整数値を代入 $ declare -p sample2 declare -ai sample2=([0]="4" [1]="5" [2]="6") <--- そのまま整数値として格納

(03) 配列要素の参照


サンプルスクリプトファイル(1)
sample1.sh
#!/bin/bash echo "配列変数 sample1 の生成" declare -a sample1=(ab cd ef) declare -p sample1 echo echo "個々の要素への参照" echo "sample1[0] = ${sample1[0]}" echo "sample1[1] = ${sample1[1]}" echo "sample1[2] = ${sample1[2]}" echo echo "[@]を使用した要素の展開(二重引用符なし)" n=0 for a in ${sample1[@]} do echo "[$n] : $a" (( n+=1 )) done echo echo "[*]を使用した要素の展開(二重引用符なし)" n=0 for a in ${sample1[*]} do echo "[$n] : $a" (( n+=1 )) done echo echo "[@]を使用した要素の展開(二重引用符有り)" n=0 for a in "${sample1[@]}" do echo "[$n] : $a" (( n+=1 )) done echo echo "[*]を使用した要素の展開(二重引用符有り)" n=0 for a in "${sample1[*]}" do echo "[$n] : $a" (( n+=1 )) done echo echo "[@]を使用した配列のインデックスの取得(二重引用符有り)" n=0 for a in "${!sample1[@]}" do echo "[$n] : $a : ${sample1[$a]}" (( n+=1 )) done echo echo "[*]を使用した配列のインデックスの取得(二重引用符有り)" n=0 for a in "${!sample1[*]}" do echo "[$n] : $a" (( n+=1 )) done echo unset sample1

実行結果(1)
$ ./sample1.sh 配列変数 sample1 の生成 declare -a sample1=([0]="ab" [1]="cd" [2]="ef") 個々の要素への参照 sample1[0] = ab <--- 各々の要素のインデックスを指定して参照 sample1[1] = cd sample1[2] = ef [@]を使用した要素の展開(二重引用符なし) [0] : ab [1] : cd [2] : ef [*]を使用した要素の展開(二重引用符なし) [0] : ab <--- 二重引用符なしの場合は「@」と「*」の違いなし [1] : cd [2] : ef [@]を使用した要素の展開(二重引用符有り) [0] : ab [1] : cd [2] : ef [*]を使用した要素の展開(二重引用符有り) [0] : ab cd ef <--- 二重引用符有りの場合は、区切り文字によって区切られた1つの単語として出力 [@]を使用した配列のインデックスの取得(二重引用符有り) [0] : 0 : ab [1] : 1 : cd [2] : 2 : ef [*]を使用した配列のインデックスの取得(二重引用符有り) [0] : 0 1 2 <--- 要素の展開と同じく二重引用符が出力に影響

サンプルスクリプトファイル(2)
sample2.sh
#!/bin/bash echo "配列変数 sample2 の生成" declare -A sample2=([key1]="ghi" [key2]="jkl" [key3]="mno") declare -p sample2 echo echo "個々の要素への参照" echo "sample2[key1] = ${sample2[key1]}" echo "sample2[key2] = ${sample2[key2]}" echo "sample2[\"key3\"] = ${sample2["key3"]}" echo echo "[@]を使用した要素の展開(二重引用符有り)" n=0 for a in "${sample2[@]}" do echo "[$n] : $a" (( n+=1 )) done echo echo "[*]を使用した要素の展開(二重引用符有り)" n=0 for a in "${sample2[*]}" do echo "[$n] : $a" (( n+=1 )) done echo echo "[@]を使用した配列のインデックスの取得(二重引用符有り)" n=0 for a in "${!sample2[@]}" do echo "[$n] : $a : ${sample2[$a]}" (( n+=1 )) done echo echo "[*]を使用した配列のインデックスの取得(二重引用符有り)" n=0 for a in "${!sample2[*]}" do echo "[$n] : $a" (( n+=1 )) done echo unset sample2

実行結果(2)
$ ./sample2.sh 配列変数 sample2 の生成 declare -A sample2=([key2]="jkl" [key3]="mno" [key1]="ghi" ) 個々の要素への参照 sample2[key1] = ghi <--- 各々の要素のキーを指定して参照 sample2[key2] = jkl sample2["key3"] = mno [@]を使用した要素の展開(二重引用符有り) [0] : jkl [1] : mno [2] : ghi [*]を使用した要素の展開(二重引用符有り) [0] : jkl mno ghi <--- 二重引用符有りの場合は、区切り文字によって区切られた1つの単語として出力 [@]を使用した配列のインデックスの取得(二重引用符有り) [0] : key2 : jkl [1] : key3 : mno [2] : key1 : ghi [*]を使用した配列のインデックスの取得(二重引用符有り) [0] : key2 key3 key1 <--- 要素の展開と同じく二重引用符が出力に影響

(04) 配列の要素数


サンプルスクリプトファイル
sample.sh
#!/bin/bash echo "配列変数の生成" declare -a sample1=("ab" "cd" "ef") declare -A sample2=([key1]=value1 [key2]=value2 [key3]=value3) declare -p sample1 declare -p sample2 echo echo "sample1 配列要素数 : ${#sample1[@]}" echo "sample2 配列要素数 : ${#sample2[@]}" echo echo "sample1[0] 配列要素長 : ${#sample1[0]}" echo "sample2[key1] 配列要素長 : ${#sample2[key1]}" unset sample1 unset sample2

実行結果
$ ./sample.sh 配列変数の生成 declare -a sample1=([0]="ab" [1]="cd" [2]="ef") declare -A sample2=([key2]="value2" [key3]="value3" [key1]="value1" ) sample1 配列要素数 : 3 sample2 配列要素数 : 3 sample1[0] 配列要素長 : 2 <--- 配列要素の文字列長 sample2[key1] 配列要素長 : 6

(05) 配列の削除・破棄


サンプルスクリプトファイル
sample.sh
#!/bin/bash echo "配列変数の生成" declare -a sample1=("ab" "cd" "ef") declare -A sample2=([key1]=value1 [key2]=value2 [key3]=value3) declare -p sample1 declare -p sample2 echo echo "配列要素の削除" unset sample1[1] unset sample2[key2] declare -p sample1 declare -p sample2 echo echo "配列要素の全削除" unset sample2[key1] unset sample2[key3] declare -p sample2 echo echo "配列の破棄" unset sample1 declare -p sample1 unset sample2

実行結果
$ ./sample.sh 配列変数の生成 declare -a sample1=([0]="ab" [1]="cd" [2]="ef") declare -A sample2=([key2]="value2" [key3]="value3" [key1]="value1" ) 配列要素の削除 declare -a sample1=([0]="ab" [2]="ef") <--- 配列要素1個を削除 declare -A sample2=([key3]="value3" [key1]="value1" ) 配列要素の全削除 declare -A sample2=() <--- 全要素削除後も配列変数自体は破棄されない 配列の破棄 ./sample.sh: line 25: declare: sample1: not found <--- 配列変数を破棄

実行環境

GNU bash, version 5.1.16
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。