1 #!/bin/bash
2 # query2.sh
3
4 numbers=(53 8 12 9 784 69 8 7 1)
5 i=4
6
7 echo ${numbers[@]} # <--- this echoes "53 8 12 9 784 69 8 7 1" to stdout.
8 echo ${numbers[i]} # <--- this echoes "784" to stdout.
9
10 unset numbers[i]
11
12 echo ${numbers[@]} # <--- this echoes "53 8 12 9 69 8 7 1" to stdout.
13 echo ${numbers[i]} # <--- stdout is blank.
Mengapa, di baris 13, apakah stdout kosong, mengingat bahwa array tampaknya telah diperbarui dilihat dari stdout baris 12?
Dan karena itu, apa yang harus saya lakukan untuk mendapatkan jawaban yang dimaksud, "69"?
Jawaban:
unset
menghapus elemen. Itu tidak memberi nomor baru pada elemen yang tersisa.Kita dapat menggunakan
declare -p
untuk melihat apa yang terjadi padanumbers
:Amati
numbers
tidak lagi memiliki elemen4
.Contoh lain
Mengamati:
Array
a
tidak memiliki elemen 2 hingga 21. Bash tidak mengharuskan indeks array berturut-turut.Metode yang disarankan untuk memaksa nomor baru indeks
Mari kita mulai dengan
numbers
array dengan elemen yang hilang4
:Jika kami ingin indeks berubah, maka:
Sekarang ada nomor elemen
4
dan memiliki nilai69
.Metode alternatif untuk menghapus elemen & nomor baru dalam satu langkah
Sekali lagi, mari kita definisikan
numbers
:Seperti yang disarankan oleh Toby Speight dalam komentar, metode untuk menghapus elemen keempat dan memberi nomor baru pada elemen yang tersisa semuanya dalam satu langkah:
Seperti yang Anda lihat, elemen keempat telah dihapus dan semua elemen yang tersisa diberi nomor baru.
${numbers[@]:0:4}
slices arraynumbers
: dibutuhkan empat elemen pertama dimulai dengan elemen 0.Demikian pula,
${numbers[@]:5}
slice arraynumbers
: dibutuhkan semua elemen dimulai dengan elemen 5 dan berlanjut ke akhir array.Memperoleh indeks array
Nilai - nilai array dapat diperoleh dengan
${a[@]}
. Untuk menemukan indeks (atau kunci ) yang sesuai dengan nilai-nilai itu, gunakan${!a[@]}
.Misalnya, pertimbangkan lagi array kami
numbers
dengan elemen yang hilang4
:Untuk melihat indeks mana yang ditugaskan:
Sekali lagi,
4
tidak ada dalam daftar indeks.Dokumentasi
Dari
man bash
:sumber
a=()
, variabela
masih tidak ditentukan sampai Anda benar-benar menetapkan salah satu indeksnya.unset numbers[4]
, tetapkan seluruh array menggunakan slicing, yaitunumbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
(saya akan memposting sebagai jawaban, tetapi tidak punya waktu untuk menjelaskan dengan benar).bash
array seperti diksh
, tidak benar-benar array, mereka lebih seperti array asosiatif dengan kunci terbatas pada bilangan bulat positif (atau disebut array jarang ). Untuk shell dengan array nyata, Anda dapat melihat di kerang sepertirc
,es
,fish
,yash
,zsh
(atau bahkancsh
/tcsh
meskipun mereka kerang memiliki begitu banyak masalah mereka lebih baik dihindari).Dalam
zsh
:(Perhatikan bahwa dalam zsh,
unset 'a[3]'
sebenarnya setel ke string kosong untuk meningkatkan kompatibilitas denganksh
)di
yash
:di
fish
(bukan shell Bourne-like yang bertentangan denganbash
/zsh
):dalam
es
(berdasarkanrc
, tidak seperti Bourne)di
ksh
danbash
Anda dapat menggunakan array sebagai array normal jika Anda melakukannya:
setelah setiap operasi hapus atau masukkan yang mungkin membuat daftar indeks tidak bersebelahan atau tidak mulai dari 0. Juga perhatikan bahwa
ksh
/bash
array mulai dari 0, bukan 1 (kecuali untuk$@
(dalam beberapa hal)).Itu akan berlaku merapikan elemen dan memindahkannya ke indeks 0, 1, 2 ... secara berurutan.
Perhatikan juga bahwa Anda perlu mengutip
number[i]
dalam:Kalau tidak, itu akan diperlakukan seperti
unset numberi
ada file yang dipanggilnumberi
di direktori saat ini.sumber