Dieser ist ein bisschen knifflig. Die Informationen, die Hauke bereitgestellt hat, sind korrekt. Es geht nur darum, sie für Ihren Anwendungsfall zu analysieren.
Am einfachsten ist es, die $()
Syntax $
so zu verwenden, dass die Variablendefinition den $()
zum Zeitpunkt der Definition enthaltenen Befehl nicht ausführt . Die Einschränkung besteht darin, dass das Endergebnis eval
zum Zeitpunkt der tatsächlichen Ausführung von der Shell (über ) neu ausgewertet werden muss, damit der verschachtelte Befehl ausgeführt werden kann.
Es ist viel einfacher, sich ein Beispiel anzusehen. Nehmen Sie also dieses, das Sie auf den richtigen Weg bringen sollte:
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
Hier ist eine Beispielausgabe aus dem obigen Beispiel (auf eine Iteration gekürzt):
1398832186.133661344
1398832187.139076728
Sie werden feststellen, dass der zweite Zeitstempel für jede Schleife etwa eine Sekunde nach dem ersten liegt. Wenn Sie dagegen denselben Test durchführen, ohne sich $
der test
Definition zu entziehen und die zu entfernen eval
, stimmen die beiden Zeitstempel nahezu überein.
Gewöhnen Sie sich nicht an, in den eval
meisten Situationen zu verwenden, aber dies ist einer von denen, bei denen ich keinen guten Weg kenne, dies zu vermeiden. Hoffentlich hilft das. Viel Glück!
$(...)
wie von Hauke vorgeschlagen, aber der Backslash ist der Schlüssel.