Используйте ссылку на переменную “в” другой переменной

Если Вы в порядке, чтобы использовать Python, дать попытку slugify, который сделан сделать преобразование символов такой как é => e. И забудьте мое предыдущее упоминание ответа konwert, который привык к преобразованию формата.

27
27.02.2014, 17:00
4 ответа

Можно сделать это с eval, встроенный ко многим прекрасным оболочкам, включая ksh:

#!/usr/bin/ksh
set $(iostat)
myvar=6
eval "echo \${$myvar}"

Прием является к двойной кавычке строкой, к которой Вы питаетесь eval так, чтобы $myvar заменили с "6", и к обратной косой черте внешний знак доллара, так, чтобы eval получает строку "6$".

Я получил "%user" для вывода, но я попробовал его на многопроцессорной машине RHEL.

30
27.01.2020, 19:39
  • 1
    Вы - официально Высший Высокий Гроссмейстер недели b/c, который даже работает над неизмеримо ужасным ksh (действительно pdksh) в OpenBSD 5.4. Если Вы хотите установить var vv на значение var, имя которого находится в var vn, просто сделайте vv=$( eval "echo \$$vn" ). Благодарит тонну! –  execNext 05.04.2014, 03:07

Косвенная ссылка на переменную

Современные усовершенствованные оболочки имеют метод для ссылки на значение переменной, имя которой хранится в другой переменной. К сожалению, метод отличается между 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]}"
26
27.01.2020, 19:39
  • 1
    Ничего себе, Ваше решение 'для Границы/POSIX' также работает в OpenBSD 5.4's ksh/pdksh. Для применения его к примеру в моем комментарии к ответу Bruce Ediger выше просто сделайте eval "vv=\${$vn}". Мерси beaucoup, вид сэр. –  execNext 05.04.2014, 03:23
[117203]Другое использование массивов Давно не использовали ни кш, ни какой-либо другой вариант, так что я не уверен, имеет ли ksh(или bash) похожую возможность. Моя основная оболочка - zsh. Я использую массивы при работе с выводами из команд типа [117498]iostat[117499], потому что они производят несколько строк, и не все строки одинакового формата/длины.

Вышеуказанное также обходит использование позиционных параметров. Теперь, если вы хотите сгенерировать, скажем, массив устройств:

-O file
--output-document=file

Мне кажется, что с меньшими кусочками гораздо проще работать. В зависимости от вашего кода, вам может понадобиться или не понадобиться использовать косвенную ссылку на переменную. Знать, как это работает, все равно полезно. Я использую ее сам.[117210]

0
27.01.2020, 19:39

Как указал Жиль (который предоставил часть ответа bash ), также не аннулируя ответ Брюса Эдигера (о том, как сделать это переносимо с помощью eval ), вот как это сделать это с nameref в недавнем mksh (и AT&T ksh93, за исключением - как прокомментировал @Gilles - namerefs не может ссылаться на позиционные параметры в AT&T ksh, только на именованные параметры):

#!/bin/mksh
set -- $(iostat)
nameref myvar=6
echo $myvar

Добавлено - после устанавливают также для улучшения сопротивления.

1
27.01.2020, 19:39

Теги

Похожие вопросы