Jestem pewien, że jest to stosunkowo proste, po prostu nie wiem jak to zrobić.
#!/usr/bin/ksh
set `iostat`
myvar=6
Chcę coś takiego, echo ${$myvar}
co chcę interpretować jako ${$myvar}
-> ${6}
->value
Jestem pewien, że jest to stosunkowo proste, po prostu nie wiem jak to zrobić.
#!/usr/bin/ksh
set `iostat`
myvar=6
Chcę coś takiego, echo ${$myvar}
co chcę interpretować jako ${$myvar}
-> ${6}
->value
Odpowiedzi:
Możesz to zrobić za pomocą eval
wbudowanego w wiele dobrych powłok, w tym ksh:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
Sztuczka polega na podwójnym zacytowaniu łańcucha, którym karmisz, aby eval
$ myvar został zastąpiony przez „6”, i odwrotnym ukośnikiem na zewnętrznym znaku dolara, aby eval
uzyskać ciąg „6 $”.
Mam dane wyjściowe „% user”, ale wypróbowałem to na wieloprocesorowym komputerze RHEL.
vv=$( eval "echo \$$vn" )
. Wielkie dzięki!
Nowoczesne zaawansowane powłoki mają metodę odwoływania się do wartości zmiennej, której nazwa jest przechowywana w innej zmiennej. Niestety metoda różni się między ksh, bash i zsh.
W mksh ≥R39b możesz utworzyć myvar
nazwę:
typeset -n myvar=6
echo "$myvar"
To nie działa w ATT ksh93, ponieważ nie obsługuje nazw w parametrach pozycyjnych. W przypadku, gdy masz zmienną zawierającą nazwę zmiennej, możesz użyć tej metody.
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
W bash ≥2,0 możesz pisać
echo "${!myvar}"
W Zsh możesz pisać
echo ${(P)myvar}
W starszych powłokach, w tym ksh88 i pdksh, jedyne wyjście, gdy masz zmienną zawierającą inną nazwę zmiennej i chcesz użyć wartości tej zmiennej eval
, jak wyjaśnił Bruce Ediger . To rozwiązanie działa w dowolnej powłoce Bourne / POSIX.
eval "value=\${$myvar}"
echo "$value"
To najlepsza metoda tutaj: jest prostsza i bardziej przenośna.
W twoim przypadku użycia, w dowolnej powłoce z tablicami (wszystkie warianty ksh, bash ≥2.0, zsh), możesz przypisać zmienną tablicową i wziąć żądany element. Uwaga: tablice ksh i bash zaczynają numerację od 0, ale zsh zaczyna się od 1, chyba że wydasz setopt ksh_arrays
lub emulate ksh
.
set -A iostat -- $(iostat)
echo "${iostat[5]}"
Jeśli chcesz skopiować parametry pozycyjne do zmiennej tablicowej a
:
set -A a -- "$@"
W ksh93, mksh ≥R39b, bash ≥2,0 i zsh, możesz użyć składni przypisania tablicy:
iostat=($(iostat))
echo "${iostat[5]}"
eval "vv=\${$vn}"
. Merci beaucoup, miły panie.
Jak wskazał Gilles (który udzielił bash
części odpowiedzi), również nie unieważniając Bruce'a Edigera (jak to zrobić przenośnie eval
), oto jak to zrobić nameref
w ostatnim mksh
(i AT&T ksh93, z wyjątkiem - jak skomentował @Gilles - namerefs nie może odnosić się do parametrów pozycyjnych w AT&T ksh, tylko do nazwanych parametrów):
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
Dodano także opcję „ --
po” set
dla zwiększenia odporności.
typeset: 6: invalid variable name
).
Od jakiegoś czasu nie używałem ani ksh, ani żadnego wariantu, więc nie jestem pewien, czy ksh (lub bash) ma podobne możliwości. Moją podstawową powłoką jest zsh. Używam tablic do obsługi danych wyjściowych z poleceń takich jak iostat, ponieważ tworzą one wiele linii, a nie wszystkie linie mają ten sam format / długość.
#! /bin/zsh
IOStatOutput=("${(@f)$(iostat)}") # Produces one element per line
Powyższe pomija również użycie parametrów pozycyjnych. Teraz, jeśli chcesz wygenerować, powiedzmy, szereg urządzeń:
for Element in {7..${#IOStatOutput}} # Devices listed in elements 7 thru the last
do
DevList+=( ${${=IOStatOutput[Element]}[1]} )
done
Mniejsze fragmenty są o wiele łatwiejsze w obsłudze. W zależności od kodu może być konieczne użycie odwołania do zmiennej pośredniej. Dobrze wiedzieć, jak to działa. Sam go używam.