ฉันมีสคริปต์ bash เชลล์ที่วนซ้ำผ่านไดเร็กทอรีชายน์ทั้งหมด (แต่ไม่ใช่ไฟล์) ของไดเร็กทอรีบางรายการ ปัญหาคือชื่อไดเร็กทอรีบางชื่อมีช่องว่าง
นี่คือเนื้อหาของไดเร็กทอรีทดสอบของฉัน:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
และรหัสที่วนซ้ำในไดเรกทอรี:
for f in `find test/* -type d`; do
echo $f
done
นี่คือผลลัพธ์:
การทดสอบ / บัลติมอร์ การทดสอบ / เชอร์รี่ เนินเขา การทดสอบ / เอดิสัน การทดสอบ / New นิวยอร์ก เมือง การทดสอบ / เดลเฟีย
Cherry Hill และ New York City ถือเป็น 2 หรือ 3 รายการแยกกัน
ฉันลองอ้างชื่อไฟล์แล้วดังนี้:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
แต่ไม่มีประโยชน์
ต้องมีวิธีง่ายๆในการทำเช่นนี้
คำตอบด้านล่างดีมาก แต่เพื่อให้ซับซ้อนมากขึ้น - ฉันไม่ต้องการใช้ไดเรกทอรีที่อยู่ในไดเรกทอรีทดสอบของฉันเสมอไป บางครั้งฉันต้องการส่งในชื่อไดเร็กทอรีเป็นพารามิเตอร์บรรทัดคำสั่งแทน
ฉันรับคำแนะนำของ Charles ในการตั้งค่า IFS และได้รับสิ่งต่อไปนี้:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
และใช้งานได้ดีเว้นแต่จะมีช่องว่างในอาร์กิวเมนต์บรรทัดคำสั่ง (แม้ว่าอาร์กิวเมนต์เหล่านั้นจะถูกยกมาก็ตาม) ตัวอย่างเช่นการเรียกใช้สคริปต์เช่นนี้test.sh "Cherry Hill" "New York City"
สร้างผลลัพธ์ต่อไปนี้:
เชอร์รี่ เนินเขา ใหม่ นิวยอร์ก เมือง
list="$@"
ทิ้งรายการของค่าเดิมโดยสิ้นเชิงยุบเป็นสตริง โปรดปฏิบัติตามแนวทางปฏิบัติในคำตอบของฉันทุกประการ - งานดังกล่าวไม่ได้รับการสนับสนุนในทุกที่ในนั้น ถ้าคุณต้องการส่งผ่านรายการอาร์กิวเมนต์บรรทัดคำสั่งไปยังโปรแกรมคุณควรรวบรวมไว้ในอาร์เรย์และขยายอาร์เรย์นั้นโดยตรง