Saya yakin itu relatif sederhana, saya hanya tidak tahu bagaimana melakukannya.
#!/usr/bin/ksh
set `iostat`
myvar=6
Saya ingin sesuatu echo ${$myvar}
yang ingin saya artikan sebagai ${$myvar}
-> ${6}
->value
shell-script
ksh
variable-substitution
Brandon Kreisel
sumber
sumber
Jawaban:
Anda dapat melakukan ini dengan
eval
, bawaan ke banyak cangkang halus, termasuk ksh:Caranya adalah dengan mengutip dua kali string yang Anda beri makan
eval
sehingga $ myvar diganti dengan "6", dan untuk backslash tanda luar dolar, sehinggaeval
mendapat string "$ 6".Saya mendapat "% pengguna" untuk output, tetapi saya mencobanya pada mesin RHEL multi-prosesor.
sumber
vv=$( eval "echo \$$vn" )
. Terima kasih banyak!Referensi variabel tidak langsung
Kerang canggih modern memiliki metode untuk referensi nilai variabel yang namanya disimpan dalam variabel lain. Sayangnya metode ini berbeda antara ksh, bash dan zsh.
Di mksh ≥R39b, Anda dapat membuat
myvar
nameref:Ini tidak berfungsi di ATT ksh93 karena tidak mendukung namerefs ke parameter posisi. Dalam kasus di mana Anda memiliki variabel yang berisi nama variabel, Anda dapat menggunakan metode ini.
Dalam bash ≥2.0, Anda dapat menulis
Di zsh, Anda dapat menulis
Dalam shell yang lebih lama, termasuk ksh88 dan pdksh, satu-satunya jalan Anda ketika Anda memiliki variabel yang berisi nama variabel lain dan ingin menggunakan nilai variabel ini
eval
, seperti yang dijelaskan oleh Bruce Ediger . Solusi ini berfungsi di semua shell Bourne / POSIX.Menggunakan array
Ini adalah metode terbaik di sini: lebih sederhana dan lebih portabel.
Untuk kasus penggunaan Anda, dalam setiap shell dengan array (semua varian ksh, bash ≥2.0, zsh), Anda dapat menetapkan ke variabel array dan mengambil elemen yang Anda inginkan. Berhati - hatilah karena array ksh dan bash mulai penomoran pada 0, tetapi zsh dimulai pada 1 kecuali Anda mengeluarkan
setopt ksh_arrays
atauemulate ksh
.Jika Anda ingin menyalin parameter posisi ke variabel array
a
:Di ksh93, mksh ≥R39b, bash ≥2.0 dan zsh, Anda dapat menggunakan sintaks penugasan array:
sumber
eval "vv=\${$vn}"
. Merci beaucoup, tuan baik.Seperti yang ditunjukkan oleh Gilles (yang memberikan
bash
bagian dari jawaban), juga tidak membatalkan Bruce Ediger (tentang cara melakukannya dengan mudaheval
), inilah cara melakukannya dengannameref
baru-baru inimksh
(dan AT&T ksh93, kecuali - seperti komentar @Gilles - namerefs tidak dapat merujuk ke parameter posisi di AT&T ksh, hanya ke parameter yang disebutkan):Menambahkan
--
afterset
untuk peningkatan resistensi juga.sumber
typeset: 6: invalid variable name
).Penggunaan array lainnya
Belum pernah menggunakan ksh atau varian apa pun untuk beberapa waktu, jadi saya tidak yakin apakah ksh (atau bash) memiliki kemampuan yang sama. Shell utama saya adalah zsh. Saya menggunakan array ketika menangani output dari perintah seperti iostat karena mereka menghasilkan beberapa baris, dan tidak semua baris memiliki format / panjang yang sama.
Di atas juga memotong penggunaan parameter posisi. Sekarang, jika Anda ingin membuat, katakanlah, serangkaian perangkat:
Saya menemukan bongkahan kecil lebih mudah untuk ditangani. Anda mungkin atau mungkin tidak perlu menggunakan referensi variabel tidak langsung, tergantung pada kode Anda. Mengetahui cara kerjanya masih merupakan hal yang baik untuk diketahui. Saya menggunakannya sendiri.
sumber