Можно сделать это с eval
, встроенный ко многим прекрасным оболочкам, включая ksh:
#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"
Прием является к двойной кавычке строкой, к которой Вы питаетесь eval
так, чтобы $myvar заменили с "6", и к обратной косой черте внешний знак доллара, так, чтобы eval
получает строку "6$".
Я получил "%user" для вывода, но я попробовал его на многопроцессорной машине RHEL.
Современные усовершенствованные оболочки имеют метод для ссылки на значение переменной, имя которой хранится в другой переменной. К сожалению, метод отличается между ksh, ударом и zsh.
В mksh ≥R39b можно сделать myvar
nameref:
typeset -n myvar=6
echo "$myvar"
Это не работает в ATT ksh93, потому что он не поддерживает namerefs к позиционным параметрам. В случае, где у Вас есть переменная, содержащая имя переменной, можно использовать этот метод.
foo=bar
typeset -n myvar=foo
echo "$myvar" # prints bar
В ударе ≥2.0, можно записать
echo "${!myvar}"
В zsh можно записать
echo ${(P)myvar}
В более старых оболочках, включая ksh88 и pdksh, Ваше единственное обращение за помощью, когда Вы имеете переменную, содержащую другое имя переменной, и хотите использовать значение этой переменной eval
, как объяснил Bruce Ediger. Это решение работает в любой оболочке Границы/POSIX.
eval "value=\${$myvar}"
echo "$value"
Это - лучший метод здесь: это более просто и более портативно.
Для Вашего варианта использования, в любой оболочке с массивами (все ksh варианты, удар ≥2.0, zsh), можно присвоить переменной типа массив и взять элемент, которого Вы желаете. Остерегайтесь этого ksh и колотите массивы, начинают нумеровать в 0, но zsh запускается в 1, если Вы не выходите setopt ksh_arrays
или emulate ksh
.
set -A iostat -- $(iostat)
echo "${iostat[5]}"
Если Вы хотите скопировать позиционные параметры в переменную типа массив a
:
set -A a -- "$@"
В ksh93, mksh ≥R39b, удар ≥2.0 и zsh, можно использовать синтаксис присваивания массива:
iostat=($(iostat))
echo "${iostat[5]}"
eval "vv=\${$vn}"
. Мерси beaucoup, вид сэр.
– execNext
05.04.2014, 03:23
Вышеуказанное также обходит использование позиционных параметров. Теперь, если вы хотите сгенерировать, скажем, массив устройств:
-O file
--output-document=file
Мне кажется, что с меньшими кусочками гораздо проще работать. В зависимости от вашего кода, вам может понадобиться или не понадобиться использовать косвенную ссылку на переменную. Знать, как это работает, все равно полезно. Я использую ее сам.[117210]
Как указал Жиль (который предоставил часть ответа bash
), также не аннулируя ответ Брюса Эдигера (о том, как сделать это переносимо с помощью eval
), вот как это сделать это с nameref
в недавнем mksh
(и AT&T ksh93, за исключением - как прокомментировал @Gilles - namerefs не может ссылаться на позиционные параметры в AT&T ksh, только на именованные параметры):
#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar
Добавлено -
после устанавливают
также для улучшения сопротивления.
vv=$( eval "echo \$$vn" )
. Благодарит тонну! – execNext 05.04.2014, 03:07