Это немного сложно. Информация, предоставленная Хауке, верна, это просто вопрос ее анализа для вашего варианта использования.
Самый простой способ - использовать $()
синтаксис, избегая так $
, чтобы определение переменной не выполняло команду, заключенную $()
в момент определения. Предостережение заключается в том, что конечный результат должен быть повторно оценен (через eval
) оболочкой во время фактического выполнения для выполнения вложенной команды.
Гораздо проще взглянуть на пример, поэтому возьмите этот, который должен поставить вас на правильный путь:
for((i=0;i<10;i++)); do
date +%s.%N # Print a timestamp (in format seconds.nanoseconds)
test="echo \$(date +%s.%N)" # Save a command to do the same
sleep 1 # Sleep for a second
eval "$test" # Evaluate the command saved in variable 'test'
echo # Print a new line before the next iteration
done
Вот пример выходных данных из примера выше (урезанный до одной итерации):
1398832186.133661344
1398832187.139076728
Вы заметите, что вторая временная метка для каждого цикла составляет около секунды после первой. С другой стороны , если вы выполняете один и тот же тест без возможности избежать $
в test
определении и удаления eval
, две временные метки будут почти совпадают.
Не привыкать использовать eval
в большинстве ситуаций, но это один из тех, где я не знаю, как избежать этого. Надеюсь, это поможет. Удачи!
$(...)
как предложил Хауке, но обратная косая черта - это ключ.