วิธีการตัดเครื่องหมายทับสุดท้ายของเส้นทางไดเรกทอรี?


17

ฉันมีสคริปต์ที่ต้องการไดเรกทอรีเป็นหนึ่งอาร์กิวเมนต์ ฉันต้องการที่จะสนับสนุนทั้งสองรูปแบบ: หนึ่งเหมือน

a/b/c

(ไม่มีฟันแทงตอนท้าย) และอีกอันก็เหมือน

 a/b/c/

(มีเครื่องหมายทับที่ท้าย)

คำถามของฉัน: ด้วยรูปแบบใดรูปแบบหนึ่งทั้งสองฉันจะเปลี่ยนรูปแบบแรกให้เป็นแบบเดิมได้อย่างไรและตัดเครื่องหมายสแลชสุดท้ายของรูปแบบที่สองเพื่อแปลงเป็นรูปแบบแรก


2
ไม่ว่ามันควรจะเป็นมากเป็นปัญหา - /ที่ใดก็ได้คู่เฉือนยกเว้นในช่วงเริ่มต้นจะเทียบเท่ากับการเฉือนเดียวจึงไม่ต้องกังวลเกี่ยวกับการร่วมงานกับพวกเขาโดยใช้
muru

@muru ฉันไม่เคยรู้เรื่องนี้มาก่อน :)
Yulong Ao

นี่คือคำถามที่ดีเกี่ยวกับตัวแยกเส้นทางหลายตัวติดต่อกัน
Peter.O

1
@muru เฉือนที่สิ้นสุดสามารถสร้างความแตกต่างเช่นความแตกต่างระหว่างการแสดงบน symlink rsyncและทำหน้าที่ในไดเรกทอรีชี้ไปหรือโต้แย้งแหล่งที่มาของ
Gilles 'หยุดความชั่วร้าย'

@Gilles แน่นอน แต่อย่างที่คุณเห็นฉันกำลังพูดถึงเส้นทางการเข้าร่วม
muru

คำตอบ:



12

หากต้องการลบเครื่องหมายสแลชต่อท้ายหากมีอยู่คุณสามารถใช้การขยายพารามิเตอร์การกำจัดส่วนต่อท้ายที่มีอยู่ในเชลล์สไตล์ POSIX ทั้งหมด:

x=${x%/}

มีภาวะแทรกซ้อนเล็กน้อย สิ่งนี้จะลบเครื่องหมายสแลชเดียวเท่านั้นดังนั้นหากคุณเริ่มต้นด้วยa/b/c//คุณจะยังคงอยู่กับสแลช นอกจากนี้หากเส้นทางเดิมคือ/คุณจะต้องเก็บไว้ทับ นี่คือวิธีแก้ปัญหาที่ซับซ้อนมากขึ้นซึ่งดูแลกรณีเหล่านี้:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

อีกวิธีหนึ่งคือ ksh หรือ bash หลังจากshopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

โปรดทราบว่าในหลายกรณีมันไม่สำคัญว่าจะมีเครื่องหมายทับ มันจะมีความหมายถ้าอาร์กิวเมนต์เป็นลิงก์สัญลักษณ์ไปยังไดเรกทอรี: ด้วยเครื่องหมายทับท้ายอาร์กิวเมนต์จะกำหนดไดเรกทอรีในขณะที่ไม่มีเครื่องหมายทับท้ายอาร์กิวเมนต์จะกำหนดลิงก์สัญลักษณ์เอง นอกจากนี้ยังมีความสำคัญกับโปรแกรมอื่น ๆ ไม่กี่ตัวอย่างเช่นอาร์กิวเมนต์แหล่งที่มาของrsyncการได้รับการปฏิบัติที่แตกต่างกันขึ้นอยู่กับการปรากฏตัวของต่อท้ายทับ


2

realpathแก้ไขเส้นทางที่กำหนด เหนือสิ่งอื่นใดมันยังลบเครื่องหมายสแลช ใช้-sเพื่อป้องกันการเชื่อมโยงต่อไปนี้

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.