Saya punya dua array:
arrayA=(1 2 3)
arrayB=(a b c)
dan saya ingin mencetak salah satunya menggunakan argumen baris perintah, yaitu tanpa if else
.
Saya mencoba beberapa variasi pada sintaks tetapi tidak berhasil. Saya ingin melakukan sesuatu seperti ini:
ARG="$1"
echo ${array${ARG}[@]}
tapi saya mendapatkan kesalahan "substitusi buruk". Bagaimana saya bisa mencapai ini?
Jawaban:
Coba lakukan ini:
CATATAN
man bash
(ekspansi parameter):sumber
!
dilakukan di depanvar
variabel? Bagaimana cara kerjanya, sepertinya itu pengganti sejarah pada googling, tapi saya tidak bisa melihat bagaimana itu bekerja di sini.Meskipun Anda dapat menggunakan akses tidak langsung seperti yang ditunjukkan dalam jawaban lain, cara lain (dalam ksh dan Bash 4.3 dan yang lebih baru) adalah dengan menggunakan nameref. Terutama dalam hal array, ini mungkin lebih berguna karena Anda dapat mengindeks array melalui nameref dan tidak perlu menempatkan indeks dalam variabel yang digunakan sebagai referensi.
Ini tidak berfungsi melalui akses tidak langsung:
Seperti yang mungkin dikatakan oleh seorang programmer C, di
${!q[1]}
sini bertindak seolah-olahq
adalah array dari pointer, bukannya menjadi pointer ke array.sumber
Catatan: melarikan diri dari tempat tidur jika ada ruang !
sumber
Ini membutuhkan banyak trial and error tetapi akhirnya berhasil.
Saya mengambil beberapa inspirasi dari Youness. Tetapi semua jawaban lain tidak membantu bash lama saya (suse11sp1 [3.2.51 (1) -release])
Loop 'untuk' menolak untuk memperluas array tidak langsung, sebagai gantinya Anda perlu melakukan pra-perluasannya, menggunakannya untuk membuat array lain dengan nama variabel baru Anda. Contoh saya di bawah ini menunjukkan loop ganda, karena itulah tujuan saya.
Saya menggunakan # untuk menghapus "New_" dari entri array pertama, kemudian menyatukan dengan "sesuatu", untuk mendapatkan "FOOthings". \ $ {} dengan gema dan eval, kemudian lakukan tugas mereka tanpa membuang kesalahan, yang dibungkus dengan $ (baru) dan ditugaskan nama variabel baru.
UPDATE ##### 2018/06/07Saya baru-baru ini menemukan satu putaran lagi tentang masalah ini. Variabel yang dibuat sebenarnya bukan array, tetapi string yang dibatasi ruang. Untuk tugas di atas ini ok, karena bagaimana "untuk" bekerja, tidak membaca array, diperluas dan kemudian diulang, lihat ekstrak di bawah ini:
Tapi, saya kemudian perlu menggunakannya sebagai array. Untuk ini saya perlu melakukan satu langkah lagi. Saya mengambil kode kata demi kata oleh Dennis Williamson . Saya sudah mengujinya dan berfungsi dengan baik.
"IFS = ','" adalah variabel yang mengandung pembatas Anda. "baca" dengan "-a" memotong dan memasukkan sengatan kembali ke variabel array. Catatan, ini tidak menghormati tanda kutip, tetapi ada beberapa opsi dalam membaca untuk mengelola ini, misalnya saya telah menghapus tanda -r yang tidak saya butuhkan. Jadi saya sekarang telah menggabungkan penambahan ini dalam pembuatan variabel, yang memungkinkan data untuk diperlakukan dan ditangani sebagaimana mestinya.
sumber
tidak mungkin :(
jika array Anda sesederhana itu, gunakan array asosiatif
Sayangnya, jika array Anda lebih rumit (misalnya
array=( "a b" c )
), itu tidak akan berfungsi. Kemudian, Anda perlu berpikir lebih keras tentang cara lain untuk mencapai tujuan Anda.sumber
Menggunakan
eval
sumber
Ini adalah bagaimana Anda akan membuat variabel bernama dinamis (versi bash <4.3).
Di bawah ini adalah sekelompok fungsi yang dapat digunakan untuk mengelola array bernama dinamis (versi bash <4.3).
Di bawah ini adalah sekelompok fungsi yang dapat digunakan untuk mengelola array bernama dinamis (versi bash> = 4.3).
Untuk detail lebih lanjut tentang contoh-contoh ini kunjungi Getting Bashed oleh Dynamic Arays oleh Ludvik Jerabek
sumber