Во-первых, Вы не в /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
Иначе Вы могли попробовать:
$ A=B
$ read $A <<< 81
$ echo "$B"
81
Но существует угроза безопасности(!) как со всеми этими методами (также declare
/ typeset
и конечно eval
).. В этом случае нужно управлять левой стороной (значение $A
), другими словами, по крайней мере, в bash
, переменная $A
не должен содержать управляемый вход пользователя, например, входной файл, и так далее...
Если Ваша оболочка не поддерживает здесь-строку ( <<<
) Вы могли также использовать здесь-документ вместо этого:
A=B
read $A << EOF
82
EOF
echo "$B"
Можно сделать это с typeset
встроенный:
$ A=B
$ typeset $A=42
$ echo $B
42
Или использование declare
:
$ declare $A=1
$ echo $B
1
bash
, typeset
является устаревшим, и его замена declare
. Они более или менее идентичны.
– jw013
18.03.2013, 18:34
Следуя косвенность при получении значения переменной …
Портативный путь состоит в том, чтобы использовать 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"
eval
) корректный ответ. Это портативно, придерживается стандарта POSIX и является тем, используемым повсеместно в более усовершенствованных сценариях оболочки. Одна вещь, хотя: использование export
на той же строке, поскольку присвоение не является портативным.
– MadScientist
19.03.2013, 14:32
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