จัสตินชี้แจงคำถามของเขาในความคิดเห็นแรกเกี่ยวกับคำตอบของควอนตั้ม เขากำลังอ่านข้อความเป็นบรรทัดโดยใช้read
(หรือโดยวิธีการไดนามิกอื่น ๆ ) และต้องการขยายตัวหนอน
คำถามจะกลายเป็น "คุณจะดำเนินการขยายตัวหนอนบนเนื้อหาของตัวแปรได้อย่างไร"
วิธีการทั่วไปคือการใช้eval
แต่มันมาพร้อมกับ caveats ที่สำคัญบางอย่างคือช่องว่างและการเปลี่ยนเส้นทางออก ( >
) ในตัวแปร ดูเหมือนว่าต่อไปนี้จะได้ผลสำหรับฉัน:
read -p "Provide the destination directory: " DESTINATION
if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
echo "'$DESTINATION' does not exist." >&2;
exit 1;
fi
ลองใช้กับอินพุตต่อไปนี้:
~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again
คำอธิบาย
${mypath//>}
แถบออกตัวละครที่สามารถบังคับไฟล์ระหว่าง >
eval
- นี่
eval echo ...
คือสิ่งที่ทำให้เกิดการขยายตัวตัวหนอนที่แท้จริง
- เครื่องหมายคำพูดคู่รอบ ๆ
eval
มีไว้เพื่อรองรับชื่อไฟล์ที่มีช่องว่าง
เป็นส่วนเสริมสำหรับสิ่งนี้คุณสามารถปรับปรุง UX โดยการเพิ่ม-e
ตัวเลือกในการอ่าน:
read -p "Provide the destination directory: " -e DESTINATION
ตอนนี้เมื่อผู้ใช้พิมพ์ในแท็บตัวหนอนและฮิตมันจะขยายตัว วิธีการนี้ไม่ได้แทนที่วิธีการประเมินผลข้างต้นอย่างไรก็ตามเนื่องจากการขยายจะเกิดขึ้นเฉพาะเมื่อผู้ใช้เยี่ยมชมแท็บ หากเขาเพียงพิมพ์ ~ / foo และกดปุ่ม Enter ก็จะยังคงเป็นตัวหนอน
ดูสิ่งนี้ด้วย:
cd "~/Desktop"
คุณได้รับข้อผิดพลาด มันจะต้องไม่มีการอ้างอิงหรือเก็บไว้เป็นตัวแปร (ไม่มีเครื่องหมายคำพูด) ตัวอย่างเช่นใช้a=~/Desktop; cd $a;
งานได้ แต่ไม่a="~/Desktop"; cd Desktop;
เห็นserverfault.com/questions/417252/…