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
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
Jawaban:
Anda dapat melakukan ini dengan eval
, bawaan ke banyak cangkang halus, termasuk ksh:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
Caranya adalah dengan mengutip dua kali string yang Anda beri makan eval
sehingga $ myvar diganti dengan "6", dan untuk backslash tanda luar dolar, sehingga eval
mendapat string "$ 6".
Saya mendapat "% pengguna" untuk output, tetapi saya mencobanya pada mesin RHEL multi-prosesor.
vv=$( eval "echo \$$vn" )
. Terima kasih banyak!
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:
typeset -n myvar=6
echo "$myvar"
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.
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
Dalam bash ≥2.0, Anda dapat menulis
echo "${!myvar}"
Di zsh, Anda dapat menulis
echo ${(P)myvar}
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.
eval "value=\${$myvar}"
echo "$value"
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
atau emulate ksh
.
set -A iostat -- $(iostat)
echo "${iostat[5]}"
Jika Anda ingin menyalin parameter posisi ke variabel array a
:
set -A a -- "$@"
Di ksh93, mksh ≥R39b, bash ≥2.0 dan zsh, Anda dapat menggunakan sintaks penugasan array:
iostat=($(iostat))
echo "${iostat[5]}"
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 mudah eval
), inilah cara melakukannya dengan nameref
baru-baru ini mksh
(dan AT&T ksh93, kecuali - seperti komentar @Gilles - namerefs tidak dapat merujuk ke parameter posisi di AT&T ksh, hanya ke parameter yang disebutkan):
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
Menambahkan --
after set
untuk peningkatan resistensi juga.
typeset: 6: invalid variable name
).
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.
#! /bin/zsh
IOStatOutput=("${(@f)$(iostat)}") # Produces one element per line
Di atas juga memotong penggunaan parameter posisi. Sekarang, jika Anda ingin membuat, katakanlah, serangkaian perangkat:
for Element in {7..${#IOStatOutput}} # Devices listed in elements 7 thru the last
do
DevList+=( ${${=IOStatOutput[Element]}[1]} )
done
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.