配列

配列は複数の値を含む変数です。メンバーの番号付けは 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