อันนี้ค่อนข้างยุ่งยาก ข้อมูลที่ Hauke ให้ไว้นั้นถูกต้องมันเป็นเพียงเรื่องของการแยกวิเคราะห์สำหรับกรณีการใช้งานของคุณ
วิธีที่ง่ายที่สุดคือการใช้$()
ไวยากรณ์ในขณะที่หลีกเลี่ยงการ$
ที่คำนิยามตัวแปรไม่ได้ดำเนินการคำสั่งล้อมรอบด้วย$()
ในเวลาที่นิยาม ข้อแม้คือว่าผลลัพธ์สุดท้ายนั้นจะต้องถูกประเมินอีกครั้ง (ผ่าน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
ในสถานการณ์ส่วนใหญ่ แต่นี่เป็นหนึ่งในสิ่งที่ฉันไม่รู้วิธีหลีกเลี่ยงมัน หวังว่านี่จะช่วยได้ โชคดี!
$(...)
ตามที่แนะนำ Hauke แต่แบ็กสแลชเป็นกุญแจสำคัญ