bash
ได้รับการออกแบบเริ่มแรกในปลาย 80s เป็นโคลนบางส่วนของksh
ด้วยคุณสมบัติการโต้ตอบบางอย่างจาก csh / tcsh
ต้นกำเนิดของการเกาะเป็นวงกลมจะต้องพบในเปลือกหอยก่อนหน้านี้ที่มันสร้างขึ้น
ksh
ตัวเองเป็นส่วนขยายของเชลล์เป้าหมาย เชลล์เป้าหมายตัวเอง (เปิดตัวครั้งแรกในปี 1979 ใน Unix V7) เป็นการใช้งานที่สะอาดตั้งแต่เริ่มต้น แต่มันไม่ได้แยกออกจากเชลล์ ธ อมป์สัน (เปลือกของ V1 -> V6) และรวมคุณสมบัติต่างๆจากเปลือก Mashey
โดยเฉพาะอย่างยิ่งอาร์กิวเมนต์คำสั่งยังคงถูกคั่นด้วยช่องว่าง|
ตอนนี้เป็นตัวดำเนินการไปป์ใหม่ แต่^
ยังได้รับการสนับสนุนเป็นทางเลือก (และยังอธิบายถึงสาเหตุที่คุณทำ[!a-z]
และไม่[^a-z]
) $1
ยังคงเป็นอาร์กิวเมนต์แรกสำหรับสคริปต์และแบ็กสแลช . ตัวดำเนินการ regexp จำนวนมาก ( ^\|$
) มีความหมายพิเศษของตัวเองในเชลล์
เชลล์ ธ อมป์สันอาศัยเครื่องมือภายนอกเพื่อทำให้กลมกลืน เมื่อsh
พบ unquoted *
, [
หรือในคำสั่งก็จะเรียกใช้คำสั่งผ่าน?
glob
rm *.txt
จะจบลงด้วยการทำงานแบบ glob เมื่อ:
["glob", "rm", "*.txt"]
และ glob จะจบลงrm
ด้วยการเรียกใช้รายการไฟล์ที่ตรงกับรูปแบบนั้น
grep a.\*b *.txt
จะทำงานglob
เป็น:
["glob", "grep", "a.\252b", "*.txt"]
*
ดังกล่าวข้างต้นได้รับการยกโดยการตั้งค่าบิตที่ 8 ได้ที่ตัวละครที่การป้องกันglob
จากการรักษามันเป็นสัญลักษณ์แทน แล้วจะเอาบิตที่ก่อนที่จะเรียกglob
grep
หากต้องการทำเทียบเท่ากับ regexps ที่จะได้รับ:
regexp rm '\.txt$'
หรือ:
regexp rm '^[^.].*\.txt$'
เพื่อยกเว้นจุดไฟล์
ความต้องการที่จะหลบหนีโอเปอเรเตอร์ขณะที่พวกเขาเพิ่มเป็นสองเท่าของอักขระพิเศษของเชลล์ความจริงที่ว่า.
ชื่อไฟล์ทั่วไปเป็นโอเปอเรเตอร์ regexp ทำให้มันไม่เหมาะที่จะจับคู่ชื่อไฟล์และซับซ้อนสำหรับผู้เริ่มต้น ในกรณีส่วนใหญ่สิ่งที่คุณต้องมีคืออักขระตัวแทนที่สามารถแทนที่หนึ่ง ( ?
) หรือจำนวนใดก็ได้ ( *
) ของอักขระ
ตอนนี้กระสุนที่แตกต่างกันได้เพิ่มโอเปอเรเตอร์ต่าง ๆ ทุกวันนี้ ksh และ zsh globs (และบางส่วนbash -O extglob
ที่ใช้ชุดย่อยของ ksh globs) มีหน้าที่เทียบเท่ากับ regexps ที่มีไวยากรณ์ที่ยุ่งยากน้อยกว่าที่จะใช้กับชื่อไฟล์และไวยากรณ์เชลล์ปัจจุบัน ตัวอย่างเช่นในzsh
(ด้วยส่วนขยาย Extendedglob) คุณสามารถทำได้:
echo a#.txt
ถ้าคุณต้องการที่ (น่า) เพื่อให้ตรงกับชื่อไฟล์ที่ประกอบด้วยลำดับตามมาด้วยa
.txt
ง่ายกว่าecho (^a*\.txt$)
(ที่นี่ใช้วงเล็บปีกกาเป็นวิธีแยกตัวดำเนินการ regex ออกจากตัวดำเนินการเชลล์ซึ่งอาจเป็นวิธีหนึ่งที่เชลล์สามารถจัดการกับมันได้)
echo (foo|bar|<1-20>).(#i)mpg
สำหรับไฟล์ mpg (ตัวพิมพ์เล็กและใหญ่) ที่มีชื่อไฟล์พื้นฐานคือ foo, bar หรือเลขทศนิยมตั้งแต่ 1 ถึง 20 ...
ksh93
ตอนนี้ยังสามารถรวม regexps (พื้นฐาน, ขยาย, perl-like หรือ "augmented") ใน globs ของมัน (แม้ว่ามันจะค่อนข้าง buggy) และยังมีเครื่องมือในการแปลงระหว่าง glob และ regexp ( printf %R
, printf %P
):
echo ~(Ei:.*\.txt)
เพื่อจับคู่ (ไม่ซ่อน) ไฟล์ txt กับE xtended นิพจน์ปกติกรณีที่ฉันต้องการ
rm -- ^[^.].*\.txt$
แทนrm -- *.txt
หรือไม่