Если Вы хотите то, что Вы сказали, что хотели:
export STY="for i in {0..3}; do echo \$i; done"
Если Вы хотите то, что Вы, вероятно, на самом деле имели в виду:
function STY() {
for i in {0..3}; do echo $i; done
}
export -f STY
Короткий: используйте оценку "$hello".
(Этот ответ первоначально сказан: используйте $hello оценки, но другой плакат указал, что оценка "$hello" более безопасна.)
Как показано ниже:
bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'
Просто высказывание $hello в начале строки не работает - потому что для циклов обрабатываются перед расширением $variable (фаза ориентировала языки, я ненавижу их):
bash-2.05a$ $hello
bash: for: command not found
Но работы eval'ing:
bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$
Чем Вы были (или, возможно, был), выполнение неправильно:
bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$
Т.е. по крайней мере в версии удара я использую, {0.. 4} не делает то, что Вы думали, что это должно.
В http://www.cyberciti.biz/faq/bash-for-loop/ говорится что {0.. 4} функция прибыла в удар 3.0 +.
Возможно, Вы, как я (в woprk, не домой), действительно ли использование являетесь устаревшей версией удара?
eval $hello
, использовать eval "$hello"
. Без двойных кавычек сделан некоторый нежелательный парсинг, который может вызвать очень странные ошибки. См. этот ответ для примера (в довольно другой ситуации, но те же принципы применяются).
– Gordon Davisson
25.02.2012, 11:20
Причина, почему $hello
не работает, как Вы ожидали:
for...do...done
a Compound Command
который определяется на этапе tokenlize.for
не команда. Так, Вы не можете сделать этого:
$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token `do'
Когда удар разделил командную строку на маркеры, Это видит "for"
нет for
, так маркер do
неожиданно.
В Вашем случае:
$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found
Bash находит один маркер $hello
, затем variable-expansion
&&word-spliting
произойдите в порядке.
На самом деле удар анализирует результат как a Simple Command
:
for
) берет отдых в качестве args (i
,in
,{0..4}
, ;
, do
, ...) for
, do
, ;
, done
, и т.д. потерянный их особые значения.Проблема имеет две стороны:
Для хранения выражения escape-последовательности и специальное заключение в кавычки могли бы быть необходимы (который, кажется, является правильным в примере). Выполнение может быть выполнено двумя способами:
eval $STY
для определения переменной, данного в Вашем примере