Last Update 2022/07/25
配列
テスト項目
(01) 宣言・代入
(02) 属性指定
(03) 配列要素の参照
(04) 配列の要素数
(05) 配列の削除・破棄
実行結果(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") <--- 連想配列とはならない
実行結果(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") <--- そのまま整数値として格納
サンプルスクリプトファイル(1)
sample1.sh
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
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 <--- 要素の展開と同じく二重引用符が出力に影響
サンプルスクリプトファイル
sample.sh
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
サンプルスクリプトファイル
sample.sh
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
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。