Bashを使って配列の最後の要素を読み取る方法はありますか?

Bashを使って配列の最後の要素を読み取る方法はありますか?

たとえば、5つの要素からなる配列があるとします。

[a][b][c][d][e]

echoを使用すると、${myarray[4]}内容を確認できます。

しかし、与えられた配列の要素数がわからない場合はどうなりますか?長さが不明な配列の最後の要素を読み取る方法はありますか?つまり、右から左に読み取った配列の最初の要素は何ですか?

Bashでこれを行う方法を知りたいです。

答え1

バッシュ4.2からスタート、それでもやります。負のインデックスの使用 ${myarray[-1]}最後の要素を取得します。 2番目から最後まで同じことを行うことができ、クリティカルにも同様です。

インデックス配列要素を参照するために使用される下付き文字がゼロより小さい数値として評価されると、配列の最大インデックスより大きい1に基づいて解釈されるため、負のインデックスは配列の末尾から逆に計算されます。 1 は要素の終わりを示します。

展開にも同様に適用されます。 「表現式」と言うと、実際には式を意味します。${#myarray[@]}以前のバージョンのように計算するために配列の長さを明示的に使用する式を含むインデックスを計算するための算術式を作成できます。${myarray[${#myarray[@]} - 1]}

答え2

最新のbash(v4.1以降)

indexから最後の要素を読むことができます-1

$ a=(a b c d e f)
$ echo ${a[-1]}
f

負のインデックスを使用して最後から数字のインデックス配列へのアクセスをサポートBash バージョン 4.1-alpha から開始

前のbash(v4.0以下)

配列の長さを取得し、${#a[@]}1を引いて最後の要素を取得する必要があります。

$ echo ${a[${#a[@]}-1]}
f

$((...))Bashは配列添字を算術式として扱うため、算術計算を強制するために追加の記号(たとえば)は必要ありません。

答え3

bash配列の割り当て、参照、負のインデックスが設定されていない場合のみバッシュ4.3に追加されました。以前のバージョンでは、bashインデックスで式を使用できますarray[${#array[@]-1}]

別の方法は、古いバージョンbash(bash 3.0以降)を使用することです。

$ a=('[a]' '[b]' '[c]' '[d]' '[e]')
$ printf %s\\n "${a[@]:(-1)}"
[e]

または:

$ printf %s\\n "${a[@]: -1}"
[e]

負のオフセットを使用する場合は、拡張との混乱を避けるために:withを区切る必要があります。-:-

答え4

次のようにすることもできます。

$ a=(a b c d e f)
$ echo ${a[$(expr ${#a[@]} - 1)]}

結果:

$ f

あなたがしていることは、配列内のすべての要素の数を取得し、配列インデックス0から始まらずにすべての要素を持っているので、-1を引くことです。

関連情報