web-dev-qa-db-ja.com

bashで配列の最後の要素を読み取る方法はありますか?

たとえば、5つの要素を持つ配列がある場合:

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

echo ${myarray[4]}を使用すると、内容がわかります。

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

これをbashで行う方法を教えてください。

74
3kstc

あなたはただ 負のインデックスを使用する${myarray[-1]}最後の要素を取得します。 2番目から最後まで同じことを行うことができます。バッシュで:

インデックス付き配列の要素を参照するために使用される添え字が0未満の数値に評価される場合、添え字は配列の最大インデックスよりも1大きいと解釈されるため、負のインデックスは配列の最後からカウントされ、インデックス-1は最後の要素を指します。

割り当てについても同様です。それが「表現」と言うとき、それは本当に表現を意味します。そこに任意の算術式を書き込んで、配列の長さを使用して計算するものも含めて、インデックスを計算できます${#myarray[@]}明示的に。

97
Michael Homer

最新のbash(v4.1以降)

インデックス_-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は配列の添え字を算術式として扱うため、算術評価を強制するために$((...))などの追加の表記法を使用する必要はありません。

48
John1024

bash配列の割り当て、参照、負のインデックスでの設定解除は 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]

負のオフセットを使用する場合、:拡張と混同しないように、-:-で区切る必要があります。

15
cuonglm

アレイ

Bashの最も古い代替(bash 3.0以降)は次のとおりです。

$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)}   ${a[@]: -1}   ${a[@]:(~0)}   ${a[@]:~0}"
ee   ee   ee   ee

:の拡張として-の後にマイナス"${var:-abc}"が続く解釈を回避するには、スペースが必要です(デフォルト値を使用)。

~は算術ですビットごとの否定(1の補数またはフリップと同等)すべてのビット)。 man bashから:

算術評価

      ! ~         logical and bitwise negation  

Bash-4.2 +以降:

$ echo "${a[-1]}   ${a[(~0)]}"
ee   ee

Bash 5.0+以降:

$ echo "${a[~0]}"
ee

すべてのbashバージョン(古いbash)の場合:

$ echo "${a[   ${#a[@]}-1   ]}"    # spaces added **only** for readability
ee

@

位置引数の場合(bash 2.01以降):

$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#}   ${!#}"
ee ee ee   ee

すべてのシェルのポータブルソリューションはevalを使用することです:

eval printf '"%s\n"' \"\${$#}\"
4
Isaac