$ {0% / *} ในเชลล์สคริปต์ทำอะไร


17

ขออภัยถ้านี่เป็นคำถามที่โง่ แต่ฉันค้นหาเกี่ยวกับมันโดยไม่ประสบความสำเร็จ

บรรทัดที่สองทำหน้าที่อะไรกันแน่:

#!/bin/sh
cd ${0%/*} || exit 1

ฉันรู้ว่าคนแรกคือ shebang ที่พยายามที่สองที่จะเปลี่ยนไดเรกทอรี ${0%/*}แต่ส่วนที่ทำให้เกิดความสับสนคือ

คุณช่วยอธิบายบรรทัดที่สองให้ฉันหน่อยได้ไหม


2
ตามที่อธิบายโดย Andrea ในคำตอบ $ {0% / *} แปลเป็นเส้นทางไดเรกทอรีนำหน้าชื่อสคริปต์ในขณะที่เรียกใช้ อีกทางเลือกหนึ่งคือใช้dirnameคำสั่งในตัวเช่น$(dirname $0)
รายได้

@alwayslearning: คุณใช้เชลล์และเชลล์เวอร์ชันใดdirnameในตัว แน่นอนว่ามันไม่ได้อยู่ใน Bash v4.3.11 ซึ่งเป็นเชลล์เริ่มต้นใน Ubuntu Trusty
David Foerster

ฉันขอโทษสำหรับความสับสนเพียงตรวจสอบว่าdirnameไม่ใช่เชลล์ในตัว
สร้างรายได้

คำตอบ:


27

${0}เป็นอาร์กิวเมนต์แรกของสคริปต์เช่นชื่อสคริปต์หรือเส้นทาง ถ้าคุณเปิดสคริปต์ของคุณเป็นpath/to/script.shแล้วจะเป็นตรงที่สตริง:${0}path/to/script.sh

ส่วนหนึ่งปรับเปลี่ยนค่าของ%/* ${0}มันหมายถึง: ใช้ตัวละครทั้งหมดจนกระทั่ง/ตามด้วยชื่อไฟล์ ในตัวอย่างข้างต้นจะเป็น${0%/*}path/to

คุณสามารถเห็นมันทำงานบนเปลือกของคุณ:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh รองรับ "การทดแทนพารามิเตอร์" อื่น ๆ อีกมากมาย นี่คือตัวอย่างวิธีการใช้ชื่อไฟล์แทนพา ธ :

$ echo "${x##*/}"
script.sh

โดยทั่วไป%และ%%แถบส่วนต่อท้ายในขณะที่#และ##แถบคำนำหน้า คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการทดแทนพารามิเตอร์


2
"| | ออก 1" นี้ดูเหมือนจะไม่มีความจำเป็น: หากจะเปลี่ยน dir $ ในตอนนี้ เท่ากับ 1
Josef Klimuk

2
มันจะเป็นการดีที่จะกล่าวถึงการสร้างถูกบันทึกเป็น "ลบคำนำหน้า / รูปแบบคำต่อท้ายที่ตรงกัน" ในคู่มือ ยังเป็นวิธีที่ดีที่จะจำว่าอันไหนคือ # คือ shift 3 ( ซ้ายของ $),% คือ shift 5 ( ขวาของ $), อย่างน้อยบนแป้นพิมพ์ US
chexum

1
@JosefKlimuk: || exit 1 อาจจำเป็นเพราะcdอาจออกจากสถานะ 2 ไม่ใช่ 1 เนื่องจากข้อผิดพลาด อย่างไรก็ตามฉันยอมรับว่ามันไม่มีประโยชน์มาก (โดยปกติแล้วโปรแกรมจะไม่สนใจสถานะการออกเฉพาะ) เป็นไปได้ไหมว่านี่เป็นส่วนหนึ่งของสคริปต์ที่ใหญ่กว่านี้?
Andrea Corbellini

1
@AndreaCorbellini ถูกต้องแน่นอน วิธีการเดียวที่สามารถใช้ประโยชน์ได้ค่อนข้างดีคือเป็นส่วนหนึ่งของสคริปต์ที่มีขนาดใหญ่กว่า สคริปต์ที่เพิ่งเปลี่ยนไดเรกทอรีปัจจุบันไม่มีผลกระทบเพราะจะมีผลกับเชลล์ที่รันสคริปต์นั้น กระบวนการปกครองไม่เคยเห็นมัน
hvd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.