配列
配列は複数の値を含む変数です。メンバーの番号付けは 0 から始まり、数に上限はなく、メンバーに連続してインデックスを付ける必要もありません。
配列を作成する
配列は値を一つずつ代入することで作成できます。
ARRAY[INDEX]=value
上記の構文では、「ARRAY」は配列の名前であり、任意の有効な変数名を使用できます。 INDEX
は 0 以上の整数、または算術式です。配列の最初の要素のインデックスは 1 ではなく 0 であることに注意してください。
次に、3 つのメンバーを含む配列を作成します。
$ array[0]=val
$ array[1]=val
$ array[2]=val
配列は、1 回限りの割り当てを使用して作成することもできます。
ARRAY=(value1 value2 ... valueN)
# 以下と同じ
ARRAY=(
value1
value2
value3
)
上記の方法で配列を作成する場合、デフォルトの順序で値を割り当てることも、各値の前の位置を指定することもできます。
$ array=(a b c)
$ array=([2]=c [0]=a [1]=b)
$ days=(Sun Mon Tue Wed Thu Fri Sat)
$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
特定の値の位置のみを指定することもできます。
names=(hatter [5]=duchess alice)
上の例では、hatter
は配列の位置 0、duchess
は位置 5、alice
は配列の位置 6 です。
割り当てられていない配列要素のデフォルト値は空の文字列です。
配列を定義するときは、ワイルドカードを使用できます。
$ mp3s=( *.mp3 )
上記の例では、現在のディレクトリにあるすべての MP3 ファイルが配列に入れられます。
declare -a
コマンドを使用して最初に配列を宣言することもできます。
$ declare -a ARRAYNAME
read -a
コマンドは、ユーザーのコマンドライン入力を配列に保存します。
$ read -a dice
上記のコマンドは、ユーザーのコマンドライン入力を配列 dice
に保存します。
配列の読み取り
単一の要素を読み取る
配列内の指定された位置にあるメンバーを読み取るには、次の構文を使用します。
$ echo ${array[i]} # i 是索引
上記の構文の中括弧は必須です。そうでない場合、Bash はインデックス部分 [i]
をそのまま出力します。
$ array[0]=a
$ echo ${array[0]}
a
$ echo $array[0]
a[0]
上の例では、配列の最初の要素は「a」です。中括弧を追加しない場合、Bash は $array
の最初のメンバーの値を直接読み取り、[0]
をそのまま出力します。
メンバー全員を読む
@
と *
は配列の特別なインデックスで、配列のすべてのメンバーが返されることを示します。
$ foo=(a b c d e f)
$ echo ${foo[@]}
a b c d e f
これら 2 つの特別なインデックスは、「for」ループと組み合わせて配列を走査するために使用できます。
for i in "${names[@]}"; do
echo $i
done
@
と*
を二重引用符で囲むかどうかの違いです。
$ activities=( swimming "water skiing" canoeing "white-water rafting" surfing )
$ for act in ${activities[@]}; \
do \
echo "Activity: $act"; \
done
Activity: swimming
Activity: water
Activity: skiing
Activity: canoeing
Activity: white-water
Activity: rafting
Activity: surfing
上記の例では、配列 activities
には実際には 5 つのメンバーが含まれていますが、for...in
ループは ${activities[@]}
を直接走査するため、7 つの結果が返されます。この状況を回避するには、通常、${activities[@]}
を二重引用符で囲みます。
$ for act in "${activities[@]}"; \
do \
echo "Activity: $act"; \
done
Activity: swimming
Activity: water skiing
Activity: canoeing
Activity: white-water rafting
Activity: surfing
上の例では、${activities[@]}
が二重引用符で囲まれている場合、トラバーサルは正しい結果を返します。
${activities[*]}
は二重引用符で囲まれていません。これは、${activities[@]}
が二重引用符で囲まれていないのと同じです。
$ for act in ${activities[*]}; \
do \
echo "Activity: $act"; \
done
Activity: swimming
Activity: water
Activity: skiing
Activity: canoeing
Activity: white-water
Activity: rafting
Activity: surfing
${activities[*]}
を二重引用符で囲んだ場合、すべてのメンバーが単一の文字列として返されます。
$ for act in "${activities[*]}"; \
do \
echo "Activity: $act"; \
done
Activity: swimming water skiing canoeing white-water rafting surfing
したがって、配列をコピーする最も便利な方法は、次のように記述することです。
$ hobbies=( "${activities[@]}" )
上記の例では、配列「activities」が別の配列「hobbies」にコピーされます。
この書き方は、新しい配列にメンバーを追加する場合にも使用できます。
$ hobbies=( "${activities[@]}" diving )
上の例では、新しい配列 'hobbies' には、配列 'activities' のすべてのメンバーの後にメンバーが 1 つ追加されています。
デフォルトの場所
配列メンバーの読み取り時に指定された位置のメンバーが読み取られない場合、デフォルトで位置 '0' が使用されます。
$ declare -a foo
$ foo=A
$ echo ${foo[0]}
A
上記の例では、「foo」は配列ですが、実際には「foo[0]」に値が代入されます。
添え字なしで配列変数を参照すると、位置 '0' の配列要素が参照されます。
$ foo=(a b c d e f)
$ echo ${foo}
a
$ echo $foo
a
上記の例では、配列要素を参照するときに位置が指定されていないため、結果は '0' 位置になります。
配列の長さ
配列の長さ (つまり、配列に含まれるメンバーの数) を知るには、次の 2 つの構文を使用できます。
${#array[*]}
${#array[@]}
以下に例を示します。
$ a[100]=foo
$ echo ${#a[*]}
1
$ echo ${#a[@]}
1
上記の例では、文字列は配列要素の位置 '100' に割り当てられています。この時点では、配列の要素は 1 つだけです。
この構文を使用して特定の配列メンバーを読み取る場合、メンバーの文字列長が返されることに注意してください。これには注意が必要です。
$ a[100]=foo
$ echo ${#a[100]}
3
上記の例では、${#a[100]}
は実際には、配列 a[100]
の 100 番目のメンバーの値 (foo
) の文字列長を返します。
配列のシリアル番号を抽出する
${!array[@]}
または ${!array[*]}
は、配列のメンバーのシーケンス番号、つまりどの位置に値があるかを返すことができます。
$ arr=([5]=a [9]=b [23]=c)
$ echo ${!arr[@]}
5 9 23
$ echo ${!arr[*]}
5 9 23
上記の例では、配列の 5、9、23 番目の位置に値があります。
この構文を使用すると、「for」ループを通じて配列を反復処理することもできます。
arr=(a b c d)
for i in ${!arr[@]};do
echo ${arr[i]}
done
配列メンバーを抽出する
${array[@]:position:length}
の構文は配列メンバーを抽出できます。
$ food=( apples bananas cucumbers dates eggs fajitas grapes )
$ echo ${food[@]:1:1}
bananas
$ echo ${food[@]:1:3}
bananas cucumbers dates
上記の例では、${food[@]:1:1}
は配列の位置 1 から始まる 1 つのメンバーを返し、${food[@]:1:3}
は位置 1 のメンバーから始まる 3 つのメンバーを返します。 。
長さ引数 length
を省略した場合は、指定された位置から始まるすべてのメンバーが返されます。
$ echo ${food[@]:4}
eggs fajitas grapes
上記の例では、位置 4 から最後までのすべてのメンバーが返されます。
##配列メンバーを追加
配列の末尾にメンバーを追加するには、「+=」代入演算子を使用できます。値は配列の末尾に自動的に追加されます。それ以外の場合は、配列の最大シーケンス番号を知る必要があり、さらに面倒です。
$ foo=(a b c)
$ echo ${foo[@]}
a b c
$ foo+=(d e f)
$ echo ${foo[@]}
a b c d e f
配列を削除
配列メンバーを削除するには、「unset」コマンドを使用します。
$ foo=(a b c d e f)
$ echo ${foo[@]}
a b c d e f
$ unset foo[2]
$ echo ${foo[@]}
a b d e f
上の例では、配列内のインデックス 2 の 3 番目の要素が削除されます。
メンバーを null 値に設定すると、そのメンバーが戻り値から「隠蔽」されます。
$ foo=(a b c d e f)
$ foo[1]=''
$ echo ${foo[@]}
a c d e f
上記の例では、配列の 2 番目のメンバーが空の文字列に設定されている場合、このメンバーは配列の戻り値で「隠蔽」されます。
このメンバーはまだ存在しますが、値は null になるため、これは削除されるのではなく「非表示」であることに注意してください。
$ foo=(a b c d e f)
$ foo[1]=''
$ echo ${#foo[@]}
6
$ echo ${!foo[@]}
0 1 2 3 4 5
上記のコードでは、2 番目のメンバーが null に設定された後も、配列には 6 つのメンバーが含まれています。
null値は空文字列なので、このように書くことでも隠れた効果はありますが、この書き方は推奨されません。
$ foo[1]=
上記の書き込み方法は、配列の 2 番目のメンバーを「隠す」ことにも相当します。
配列変数を空の文字列に直接割り当てることは、配列の最初のメンバーを「隠す」ことと同じです。
$ foo=(a b c d e f)
$ foo=''
$ echo ${foo[@]}
b c d e f
上記の書き込み方法は、配列の最初のメンバーを「隠す」ことと同じです。
unset ArrayName
は配列全体をクリアできます。
$ unset ARRAY
$ echo ${ARRAY[*]}
<--no output-->
連想配列
Bash の新しいバージョンは連想配列をサポートします。連想配列は、配列インデックスとして整数の代わりに文字列を使用します。
declare -A
は連想配列を宣言できます。
declare -A colors
colors["red"]="#ff0000"
colors["green"]="#00ff00"
colors["blue"]="#0000ff"
連想配列は、-A
オプションを指定した declare
コマンドを使用して作成する必要があります。対照的に、整数インデックス付き配列の場合、変数名を使用して配列を直接作成できますが、連想配列ではそれができません。
連想配列のメンバーは、整数インデックス付きの配列とほぼ同じ方法でアクセスできます。
echo ${colors["blue"]}
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0