Действительно ли возможно использовать косвенность для установки переменных?

Во-первых, Вы не в /var/www/drupal/. Вы пытаетесь создать файл drupal в /etc/apache2/sites-available/. Если Вы хотите, чтобы файл был создан в /var/www/drupal:

sed 's/www/www\/drupal/g' default >/var/www/drupal/drupal

Иначе:

sed 's/www/www\/drupal/g' default | sudo tee drupal
7
18.03.2013, 18:22
3 ответа

Иначе Вы могли попробовать:

$ A=B
$ read $A <<< 81
$ echo "$B"
81

Но существует угроза безопасности(!) как со всеми этими методами (также declare / typeset и конечно eval).. В этом случае нужно управлять левой стороной (значение $A), другими словами, по крайней мере, в bash, переменная $A не должен содержать управляемый вход пользователя, например, входной файл, и так далее...


Если Ваша оболочка не поддерживает здесь-строку ( <<< ) Вы могли также использовать здесь-документ вместо этого:

A=B
read $A << EOF
82
EOF
echo "$B"
5
27.01.2020, 20:14
  • 1
    , ничего себе, но почему он работает? –  Sergey Grinev 18.03.2013, 18:47
  • 2
    Оболочка разворачивает переменный $A перед командой чтения.. –  Scrutinizer 18.03.2013, 19:08
  • 3
    Единственная проблема: это не работает над Солярисом –  Sergey Grinev 18.03.2013, 20:05
  • 4
    Вы могли попробовать здесь-документ вместо здесь-строки, видеть редактирование в моем сообщении.. –  Scrutinizer 18.03.2013, 22:13
  • 5
    Это не хороший метод. Это сложно, и это повреждается, если существуют специальные символы в значении (новые строки, обратные косые черты и ведущий или запаздывающий пробел на строке проблематичны). –  Gilles 'SO- stop being evil' 19.03.2013, 02:18

Можно сделать это с typeset встроенный:

$ A=B
$ typeset $A=42
$ echo $B
42

Или использование declare:

$ declare $A=1
$ echo $B
1
11
27.01.2020, 20:14
  • 1
    В bash, typeset является устаревшим, и его замена declare. Они более или менее идентичны. –  jw013 18.03.2013, 18:34
  • 2
    typeset является более портативным хотя (работает в ksh), –  Mat 18.03.2013, 18:36
  • 3
    Спасибо! не Может решить, какой ответ лучше. Зеркально отраженный монета :) –  Sergey Grinev 18.03.2013, 22:21

Следуя косвенность при получении значения переменной

Портативный путь состоит в том, чтобы использовать eval. Действительно необходимо обратить внимание на заключение в кавычки так, чтобы специальные символы в значении не были оценены, когда они не должны быть. Самый легкий путь состоит в том, чтобы сохранить новое значение в промежуточной переменной и присвоить значение той переменной.

A=B
tmp='stuff with special characters or whatever…'
eval $A=\$tmp

Аргумент eval B=$tmp, простое присвоение. Вам не нужны двойные кавычки вокруг $tmp даже если это содержит пробел или globbing символы, потому что они не расширены в присвоении.

Если Вы хотите сделать переменную среды, можно использовать export. В ударе или ksh или zsh, можно использовать typeset сделать локальную переменную (declare синонимично в ударе). Снова, необходимо использовать промежуточную переменную так, чтобы специальные символы не были искажены. Обратите внимание, что кроме zsh, необходимо поместить двойные кавычки вокруг переменного расширения, потому что это не присвоение, а встроенное, которое берет аргумент, который, оказывается, похож на присвоение.

export $A="$tmp"
8
27.01.2020, 20:14
  • 1
    Это (использование eval) корректный ответ. Это портативно, придерживается стандарта POSIX и является тем, используемым повсеместно в более усовершенствованных сценариях оболочки. Одна вещь, хотя: использование export на той же строке, поскольку присвоение не является портативным. –  MadScientist 19.03.2013, 14:32
  • 2
    @MadScientist export var=value POSIX. Это не портативно к Оболочкам Bourne, но это исчезающая порода (просто удостоверяются, что использовали /usr/xpg4/bin/sh или /usr/xpg6/bin/sh или ksh и нет /bin/sh на более старых машинах Соляриса). –  Gilles 'SO- stop being evil' 19.03.2013, 14:58

Теги

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