ฉันกำลังเรียนรู้ Bash และฉันต้องการแทนที่อักขระช่องว่างด้วยอักขระ "ไม่ว่าง" อื่น ๆ ฉันกำลังใช้forลูป:
for f in *\ *; do mv "$f" "${f// /_}"; done
คำถามของฉันคือทำไมทับสองและช่องว่างใน${f// /_}? อะไร${f// /_}ทำอย่างไร
ฉันกำลังเรียนรู้ Bash และฉันต้องการแทนที่อักขระช่องว่างด้วยอักขระ "ไม่ว่าง" อื่น ๆ ฉันกำลังใช้forลูป:
for f in *\ *; do mv "$f" "${f// /_}"; done
คำถามของฉันคือทำไมทับสองและช่องว่างใน${f// /_}? อะไร${f// /_}ทำอย่างไร
คำตอบ:
เป็นรูปแบบการแทนที่โดยใช้bashการขยายพารามิเตอร์
ใน${f// /_}:
เครื่องหมายทับสองครั้ง//ใช้สำหรับแทนที่พื้นที่ทั้งหมดด้วย_ถ้าคุณใส่เครื่องหมายทับหนึ่ง/ช่องจะมีเพียงช่องว่างแรกเท่านั้นที่จะถูกแทนที่
มีที่ว่างเพราะคุณกำลังแทนที่พื้นที่ (ด้วยเครื่องหมายขีดล่าง)
ดังนั้นรูปแบบโดยทั่วไปคือ:
${parameter//find/replace}
ตรวจสอบman bashเพื่อรับแนวคิดเพิ่มเติม
วิธีไปที่Parameter Expansionหัวข้อman bashในครั้งเดียว:
LESS=+/'Parameter Expansion' man bash
ส่วน"{f// /_}หมายถึงแทนที่ทุกช่องว่างด้วยและขีดเส้นใต้ นี่คือการใช้การขยายพารามิเตอร์ Bash ตัวแปรที่fกำหนดไว้ในfor f in *\ *;จะถูกเรียกใช้ผ่านสำหรับทุกการจับคู่ของการขยายเชลล์ (กลม) $fแต่ละครั้งที่ชื่อไฟล์ที่พบจะกลายเป็นค่า
การขยายพารามิเตอร์ใช้งานได้กับ//ความหมายทุกครั้งของอักขระต่อไปนี้//(เว้นวรรคในตัวอย่างนี้) ควรแทนที่ด้วยอักขระหลัง/(ขีดล่างในตัวอย่างนี้)