Jika saya memiliki array dengan 5 elemen, misalnya:
[a][b][c][d][e]
Menggunakan echo ${myarray[4]}
saya bisa melihat apa yang ada di dalamnya.
Tetapi bagaimana jika saya tidak tahu jumlah elemen dalam array yang diberikan? Apakah ada cara membaca elemen terakhir dari array panjang yang tidak diketahui? yaitu pembacaan elemen pertama dari kanan ke kiri untuk array apa pun?
Saya ingin tahu bagaimana melakukan ini di bash.
$@
bukan array yang tepat (tidak dapat disalin). Untuk itu, lihat Mendapatkan argumen terakhir yang diteruskan ke skrip shell .Jawaban:
Anda bisa menggunakan indeks negatif
${myarray[-1]}
untuk mendapatkan elemen terakhir. Anda dapat melakukan hal yang sama untuk yang kedua terakhir, dan seterusnya; di Bash:Hal yang sama juga berfungsi untuk penugasan. Ketika dikatakan "ekspresi" itu benar-benar berarti ekspresi; Anda dapat menulis dalam ekspresi aritmatika apa pun di sana untuk menghitung indeks, termasuk yang menghitung menggunakan panjang array
${#myarray[@]}
secara eksplisit.sumber
ksh
danzsh
juga.zsh
, secara default array adalah 1-diindeks, tidak sepertibash
dan diksh
mana mereka diindeks 0.Bash modern (v4.1 atau lebih baik)
Anda dapat membaca elemen terakhir di indeks
-1
:Dukungan untuk mengakses array yang diindeks secara numerik dari akhir menggunakan indeks negatif dimulai dengan bash versi 4.1-alpha .
Bash yang lebih lama (v4.0 atau sebelumnya)
Anda harus mendapatkan panjang array dari
${#a[@]}
dan kemudian kurangi satu untuk mendapatkan elemen terakhir:Karena bash memperlakukan subscript array sebagai ekspresi aritmatika, maka tidak perlu notasi tambahan, seperti
$((...))
, untuk memaksa evaluasi aritmatika.sumber
modern
dengan versi.bash
penugasan array, referensi, unsetting dengan indeks negatif hanya ditambahkan di bash 4.3 . Dengan versi yang lebih lamabash
, Anda dapat menggunakan ekspresi dalam indeksarray[${#array[@]-1}]
Cara lain, juga bekerja dengan versi yang lebih lama
bash
(bash 3.0 atau lebih baik):atau:
Menggunakan offset negatif, Anda harus memisahkan
:
dengan-
untuk menghindari kebingungan dengan:-
ekspansi.sumber
"${a[@]: -1}"
dan itu akan berhasil (selainbash
danzsh
) juga diksh
.zsh
ataubash
; tetapi saya mengujinya dalam tiga kulit.)array
Alternatif tertua di bash (Sejak bash 3.0+) adalah:
Ruang diperlukan untuk menghindari interpretasi
:
diikuti oleh minus-
sebagai perluasan dari"${var:-abc}"
(Gunakan Nilai Default).Ini
~
adalah negasi bitwise aritmatika (setara dengan komplemen seseorang atau membalikkan semua bit ). Dari man bash:Sejak bash-4.2 + juga:
Sejak bash 5.0+ juga:
Untuk semua versi bash (versi lama):
@
Untuk argumen posisional (sejak bash 2.01):
Solusi portabel untuk semua cangkang adalah menggunakan eval:
sumber
~
dalam manual dan tidak melihatnya.$@
?bash: ${@[@]:(-1)}: bad substitution
man bash
referensi (periksa jawaban yang diperluas di @ title). @ TomHale@
adalah tidak array (baik, tidak sepenuhnya array ) di bash dan tidak menerima indeks ([]
) subscript untuk argumen individu. Anda harus menggunakan${@:(-1)}
atau setara. Periksa entri yang diperluas di@
judul. @ TomHaleAnda juga dapat melakukan ini:
Hasil:
Apa yang Anda lakukan adalah mendapatkan semua jumlah elemen dalam array dan kurangi -1 karena Anda mendapatkan semua elemen, tidak dimulai dari indeks array yaitu 0.
sumber