“ $ {- # * i}”! =“ $ -” หมายถึงอะไร


37

ใน/etc/profileฉันเห็นสิ่งนี้:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

อะไร${-#*i}หมายถึง ${-ฉันไม่สามารถหาคำนิยามของการขยายตัวพารามิเตอร์เริ่มต้น

คำตอบ:


40

$-เป็นแฟล็กตัวเลือกปัจจุบันที่กำหนดโดยเชลล์เองในการเรียกใช้หรือใช้setคำสั่ง builtin:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"เป็นไวยากรณ์สำหรับการลบสตริง: (จากเอกสารประกอบ POSIX )

$ {พารามิเตอร์ # [คำ]}

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

$ {พารามิเตอร์ ## [คำ]}

ลบรูปแบบคำนำหน้าใหญ่ที่สุด คำนั้นจะถูกขยายเพื่อสร้างรูปแบบ จากนั้นการขยายพารามิเตอร์จะส่งผลให้เกิดพารามิเตอร์โดยส่วนที่ใหญ่ที่สุดของคำนำหน้าตรงกับรูปแบบที่ถูกลบ

ดังนั้น${-#*i}ลบสตริงที่สั้นที่สุดจนถึงiตัวแรก:

$ echo "${-#*i}"
mBH

ในกรณีของคุณif [ "${-#*i}" != "$-" ]ตรวจสอบว่าเปลือกของคุณเป็นแบบโต้ตอบหรือไม่


23

$-มีพารามิเตอร์เปลือก ในกรณีของฉัน:

$ echo $-
himB

${-}เหมือนกัน$-เหมือน${foo}กัน$fooทุกประการ

#*iวิธีการ: ลบ (น้อยที่สุดเท่าที่เป็นไปได้ไม่ได้สร้างความแตกต่างที่นี่) จากจุดเริ่มต้นของค่าตัวแปรจน (รวม) iเป็นครั้งแรก

$ echo "${-#*i}"
mB

ในคำอื่น ๆ : [ "${-#*i}" != "$-" ]ตรวจสอบว่ามีiในค่าของ$-ตัวแปรนั่นคือมันจะตรวจสอบว่าเปลือกเป็นแบบโต้ตอบ

กล่าวอีกนัยหนึ่งมันเป็นวิธีการเขียนที่ซับซ้อนและไม่เข้ากับบอร์น:

case $- in
  *i*) ...;;
  *) ...;;
esac

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