Điều này là một chút khó khăn. Thông tin mà Hauke đã cung cấp là chính xác, đó chỉ là vấn đề phân tích nó cho trường hợp sử dụng của bạn.
Cách dễ nhất là sử dụng $()
cú pháp trong khi thoát khỏi $
định nghĩa sao cho định nghĩa biến không thực thi lệnh được bao quanh bởi $()
tại thời điểm định nghĩa. Thông báo trước là kết quả cuối cùng phải được đánh giá lại (thông qua eval
) bởi trình bao tại thời điểm thực hiện thực tế để lệnh lồng nhau thực thi.
Việc xem xét một ví dụ dễ dàng hơn nhiều, vì vậy hãy lấy ví dụ này, điều này sẽ đưa bạn đi đúng hướng:
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
Đây là đầu ra mẫu từ ví dụ trên (được cắt thành một lần lặp):
1398832186.133661344
1398832187.139076728
Bạn sẽ nhận thấy rằng dấu thời gian thứ hai cho mỗi vòng lặp là khoảng một giây sau lần đầu tiên. Ngược lại, nếu bạn thực hiện các thử nghiệm tương tự mà không cần thoát khỏi $
trong test
định nghĩa và loại bỏ eval
, hai timestamps sẽ gần khớp với nhau.
Đừng có thói quen sử dụng eval
trong hầu hết các tình huống, nhưng đây là một trong những cách mà tôi không biết cách tốt để tránh nó. Hy vọng điều này sẽ giúp. Chúc may mắn!
$(...)
như Hauke đề xuất nhưng dấu gạch chéo ngược là chìa khóa.