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
shell-script
ksh
variable-substitution
Brandon Kreisel
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą
eval
wbudowanego w wiele dobrych powłok, w tym ksh: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, abyeval
uzyskać ciąg „6 $”.Mam dane wyjściowe „% user”, ale wypróbowałem to na wieloprocesorowym komputerze RHEL.
źródło
vv=$( eval "echo \$$vn" )
. Wielkie dzięki!Pośrednie odniesienie do zmiennej
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ę: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.
W bash ≥2,0 możesz pisać
W Zsh możesz pisać
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.Korzystanie z tablicy
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
lubemulate ksh
.Jeśli chcesz skopiować parametry pozycyjne do zmiennej tablicowej
a
:W ksh93, mksh ≥R39b, bash ≥2,0 i zsh, możesz użyć składni przypisania tablicy:
źródło
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śnieeval
), oto jak to zrobićnameref
w ostatnimmksh
(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):Dodano także opcję „
--
po”set
dla zwiększenia odporności.źródło
typeset: 6: invalid variable name
).Kolejne użycie tablic
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ść.
Powyższe pomija również użycie parametrów pozycyjnych. Teraz, jeśli chcesz wygenerować, powiedzmy, szereg urządzeń:
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.
źródło