เครื่องหมายทับคู่หมายถึงอะไรใน `$ {f // / _} '


17

ฉันกำลังเรียนรู้ Bash และฉันต้องการแทนที่อักขระช่องว่างด้วยอักขระ "ไม่ว่าง" อื่น ๆ ฉันกำลังใช้forลูป:

for f in *\ *; do mv "$f" "${f// /_}"; done

คำถามของฉันคือทำไมทับสองและช่องว่างใน${f// /_}? อะไร${f// /_}ทำอย่างไร


3
หากคุณไม่จำเป็นต้องเรียนรู้มันด้วยหัวใจอย่างน้อยคุณควรทราบว่าจะอ่านเกี่ยวกับ: มันอยู่ในคู่มือการทุบตี
เกล็นแจ็คแมน

คำตอบ:


19

เป็นรูปแบบการแทนที่โดยใช้bashการขยายพารามิเตอร์

ใน${f// /_}:

  • เครื่องหมายทับสองครั้ง//ใช้สำหรับแทนที่พื้นที่ทั้งหมดด้วย_ถ้าคุณใส่เครื่องหมายทับหนึ่ง/ช่องจะมีเพียงช่องว่างแรกเท่านั้นที่จะถูกแทนที่

  • มีที่ว่างเพราะคุณกำลังแทนที่พื้นที่ (ด้วยเครื่องหมายขีดล่าง)

ดังนั้นรูปแบบโดยทั่วไปคือ:

${parameter//find/replace}

ตรวจสอบman bashเพื่อรับแนวคิดเพิ่มเติม

วิธีไปที่Parameter Expansionหัวข้อman bashในครั้งเดียว:

LESS=+/'Parameter Expansion' man bash

2
ในระยะสั้นมันคือการค้นหาทั่วโลกและแทนที่
เกล็นแจ็คแมน

3

ส่วน"{f// /_}หมายถึงแทนที่ทุกช่องว่างด้วยและขีดเส้นใต้ นี่คือการใช้การขยายพารามิเตอร์ Bash ตัวแปรที่fกำหนดไว้ในfor f in *\ *;จะถูกเรียกใช้ผ่านสำหรับทุกการจับคู่ของการขยายเชลล์ (กลม) $fแต่ละครั้งที่ชื่อไฟล์ที่พบจะกลายเป็นค่า

การขยายพารามิเตอร์ใช้งานได้กับ//ความหมายทุกครั้งของอักขระต่อไปนี้//(เว้นวรรคในตัวอย่างนี้) ควรแทนที่ด้วยอักขระหลัง/(ขีดล่างในตัวอย่างนี้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.