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