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จากการรักษามันเป็นสัญลักษณ์แทน แล้วจะเอาบิตที่ก่อนที่จะเรียกglobgrep
หากต้องการทำเทียบเท่ากับ 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หรือไม่