Это немного сложно. Информация, предоставленная Хауке, верна, это просто вопрос ее анализа для вашего варианта использования.
Самый простой способ - использовать $()синтаксис, избегая так $, чтобы определение переменной не выполняло команду, заключенную $()в момент определения. Предостережение заключается в том, что конечный результат должен быть повторно оценен (через 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в большинстве ситуаций, но это один из тех, где я не знаю, как избежать этого. Надеюсь, это поможет. Удачи!
$(...)как предложил Хауке, но обратная косая черта - это ключ.