$ {! НЕЧТО} и zsh

Виртуальный носитель по IPMI, но это зависит, если Ваш сервер является реальным сервером или недорогой машиной.

13
15.03.2013, 12:17
4 ответа

Оба удара и zsh имеют способ выполнить косвенное расширение, но они используют другой синтаксис.

Достаточно легко выполнить косвенное использование расширения eval; это работает во всем POSIX и большинстве Оболочек Bourne. Заботьтесь для заключения в кавычки правильно в случае, если значение содержит символы, которые имеют особое значение в оболочке.

eval "value=\"\${$VAR}\""
echo "$VAR"
echo "$value"

${${VAR}} не работает, потому что это не опция, которую реализует любая оболочка. Вещь в фигурных скобках должна соответствовать синтаксическим правилам, которые не включают ${VAR}. (В zsh это - поддерживаемый синтаксис, но делает что-то другое: вложенные замены выполняют последовательные преобразования на том же значении; ${${VAR}} эквивалентно $VAR так как это выполняет преобразование идентификационных данных дважды на значении.)

18
27.01.2020, 19:52

Вы не используете оценку правильно. В Вашем значении в качестве примера $VAR, которому предшествуют с "$" (т.е. '$VALUE'), был бы выполнен как команда. Это не то, что Вы хотите. Вы хотите оценить расширение переменной, имя которой взято от другой переменной.

$ for i in `echo PATH MAIL EDITOR`; 
    do eval moo="\${$i}" 
    echo $moo 
done
/usr/local/sbin:/usr/local/bin:/usr/sbin:/u (...)
/var/mail/root
nano
3
27.01.2020, 19:52
[116500] Комментарий, под исходным вопросом, составленный Профпатчем, дает пример [116980]${(p)FOO}[116981] для вывода содержимого ссылки на косвенную переменную. Флаг неверный или опечатка, он должен быть заглавным P, а не нижним регистром p. Использовать: [116982]${(P)FOO}[116983]. Должно получиться следующее:

When you have a situation where you have two subnets 
that are the same addressing that wish to communicate, it's a useful hack 
because it allows you to de-couple them into separate address space.

    ASCII Art 3: Attempt 2

            Network 1
            192.168.150.0 (Corp)
                             |
            Network 2        |
            192.168.180.0 (Intermediate)
                                    |
                    NAT BOX 1       |
                    eth0 192.168.180.180
                    eth1 10.15.15.1
                                |
                    NAT BOX 2   |
                    eth0 10.15.15.2
                    eth1 192.168.150.252
                                    |
            Newtwork 3              |
            192.168.150.0 (Untrusted Network)

из man-страницы [116984]zshexpn[116985]; раздел - [116986]Флаги расширения параметров[116987]:
PЭто заставляет значение имени параметра интерпретироваться как следующее имя параметра, значение которого будет использоваться там, где это необходимо. Обратите внимание, что флаги, установленные одним из семейства типовых наборов команд (в конкретном случае трансформирования) не применяются к значению имени, используемому в этом способе. Если используется с вложенным параметром или подстановкой команды, результат этого будет воспринято как имя параметра таким же образом. Например, если у вас есть `foo=bar' и `bar=baz', строки ${(P)foo}, ${(P)${foo}}, и ${(P)$(echo bar)} будет расширен до `baz''.

Одно время я читал, почему [116992]${${${VAR}}}[116993] не выдает ожидаемого результата, но в данный момент я не могу его найти. Вы можете сделать что-то вроде следующего:

19
27.01.2020, 19:52

{ba,z}shрешение

Вот функция, которая работает как в {ba,z}sh. Я считаю, что он также совместим с POSIX.

Предупреждает при подаче:

  • Нулевой ввод
  • Более одного аргумента
  • Не задано имя переменной
# Expand the variable named by $1 into its value. Works in both {ba,z}sh
# eg: a=HOME $(var_expand $a) == /home/me
var_expand() {
  if [ "$#" -ne 1 ] || [ -z "${1-}" ]; then
    printf 'var_expand: expected one non-empty argument\n' >&2;
    return 1;
  fi
  eval printf '%s' "\"\${$1?}\""
}
0
27.01.2020, 19:52

Теги

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