Це трохи хитро. Інформація, яку надав Хоуке, є правильною, це лише питання розбору її для вашого випадку використання.
Найпростіший спосіб - використовувати $()синтаксис, уникаючи $такого, щоб визначення змінної не виконувало команди, додані $()до моменту визначення. Застереження полягає в тому, що кінцевий результат повинен бути повторно оцінений (через 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в більшості ситуацій, але це одна з тих, де я не знаю хорошого способу уникнути цього. Сподіваємось, це допомагає. Удачі!
$(...)як запропонував Хоуке, але ключовим є зворотний нахил.