[A-Z]ในbashการแข่งขันทั้งหมดเรียงองค์ประกอบ (ตัวละคร แต่ยังเรียกเป็นลำดับของตัวอักษรเช่นDszในตำแหน่งที่ฮังการี) ที่จัดเรียงหลังและจัดเรียงก่อนA Zในสถานที่ของคุณcอาจเรียงลำดับระหว่าง B และ C
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
ดังนั้นcหรือzจะได้รับการจับคู่โดย[A-Z]แต่ไม่ได้หรือẐa
$ printf '%s\n' A a á b B c C Ç z Z Ẑ |
pipe> bash -c 'while IFS= read -r x; do case $x in [A-Z]) echo "$x"; esac; done'
A
á
b
B
c
C
Ç
z
Z
ในโลแคล C ลำดับจะเป็น:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
ดังนั้น[A-Z]จะตรงกับA, B, C, Zแต่ไม่ได้และยังไม่ÇẐ
หากคุณต้องการจับคู่กับตัวอักษรตัวพิมพ์ใหญ่ (ในสคริปต์ใด ๆ ) คุณสามารถใช้[[:upper:]]แทน ไม่มีวิธีในตัวในbashการจับคู่ตัวอักษรตัวพิมพ์ใหญ่ในสคริปต์ละตินเท่านั้น (ยกเว้นการแสดงรายการเป็นรายบุคคล)
หากคุณต้องการจับคู่AกับตัวอักษรZ ภาษาอังกฤษโดยไม่มีการออกเสียงคุณสามารถใช้[A-Z]หรือ[[:upper:]]แต่ในCโลแคล (สมมติว่าข้อมูลไม่ได้เข้ารหัสในชุดอักขระเช่น BIG5 หรือ GB18030 ซึ่งมีอักขระหลายตัวซึ่งการเข้ารหัสประกอบด้วยการเข้ารหัสของตัวอักษรเหล่านั้น) หรือรายการ พวกเขาเป็นรายบุคคล ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ])
โปรดทราบว่ามีการเปลี่ยนแปลงบางอย่างระหว่างเปลือกหอย
สำหรับzsh, bash -O globasciiranges(ตัวเลือกชื่อแปลกแนะนำในทุบตี-4.3), schily-shและyash, [A-Z]ตรงกับตัวอักษรที่มีจุดรหัสอยู่ระหว่างที่Aและที่ของZเพื่อจะเทียบเท่ากับการทำงานของbashในภาษาซี
สำหรับเถ้า, mksh และกระสุนโบราณเช่นเดียวกับzshข้างบน แต่ จำกัด อยู่ที่ charsets ไบต์เดียว นั่นคือในโลแคล UTF-8 [É-Ź]จะไม่ตรงกันÓแต่เนื่องจาก[<c3><89>-<c5><b9>]นั่นจะตรงกับค่าไบต์ 0x89 ถึง 0xc5!
ksh93ประพฤติตัวเหมือนbashยกเว้นว่ามันจะถือว่าเป็นกรณีพิเศษช่วงที่ปลายทั้งสองเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็กหรือตัวอักษรตัวพิมพ์ใหญ่ ในกรณีนั้นมันจะจับคู่เฉพาะกับองค์ประกอบการเรียงที่เรียงลำดับระหว่างปลายเหล่านั้น แต่นั่นคือ (หรืออักขระตัวแรกของพวกเขาสำหรับองค์ประกอบการเรียงหลายตัวละคร) ยังตัวพิมพ์เล็ก (หรือตัวพิมพ์ใหญ่ตามลำดับ) ดังนั้น[A-Z]ก็จะตรงกับในÉแต่ไม่ได้อยู่ในeฐานะeที่ไม่เรียงลำดับระหว่างAและZได้ แต่ไม่เป็นตัวพิมพ์ใหญ่เหมือนและAZ
สำหรับfnmatch()รูปแบบ (ในfind -name '[A-Z]') หรือนิพจน์ทั่วไปของระบบ (ดังในgrep '[A-Z]') มันขึ้นอยู่กับระบบและสถานที่ ตัวอย่างเช่นในระบบ GNU ที่นี่[A-Z]ไม่ตรงกับxในen_GB.UTF-8ภาษา แต่จะอยู่ในระบบth_TH.UTF-8เดียว มันไม่ชัดเจนสำหรับฉันเกี่ยวกับข้อมูลที่ใช้ในการพิจารณา แต่เห็นได้ชัดว่าอิงจากตารางการค้นหาที่ได้มาจากข้อมูลโลแคล LC_COLLATE )
ลักษณะการทำงานทั้งหมดได้รับอนุญาตจาก POSIX เนื่องจาก POSIX จะหยุดการทำงานของช่วงที่ไม่ได้ระบุไว้ในสถานที่อื่นนอกเหนือจากภาษา C ตอนนี้เราสามารถโต้แย้งข้อดีของแต่ละวิธีได้
bashวิธีการ 's ทำให้ความรู้สึกมากเช่นเดียวกับ[C-G]ที่เราต้องการตัวอักษรในระหว่างและC Gและการใช้ลำดับการจัดเรียงของผู้ใช้สำหรับสิ่งที่กำหนดว่าอะไรที่อยู่ในระหว่างนั้นเป็นแนวทางที่มีเหตุผลที่สุด
ตอนนี้ปัญหาคือว่ามันทำลายความคาดหวังของผู้คนจำนวนมากโดยเฉพาะอย่างยิ่งคนที่เคยชินกับพฤติกรรมดั้งเดิมของ pre-Unicode แม้กระทั่งวันก่อนสากล ขณะที่จากผู้ใช้ปกติก็อาจทำให้รู้สึกว่า[C-I]รวมถึงhเป็นhตัวอักษรที่อยู่ในระหว่างCและIและ[A-g]ไม่รวมZมันเป็นเรื่องที่แตกต่างกันสำหรับคนที่มีการจัดการกับ ASCII เพียงมานานหลายทศวรรษ
ว่าbashพฤติกรรมยังจะแตกต่างจาก[A-Z]การจับคู่ในช่วงเครื่องมือ GNU อื่น ๆ เช่นในการแสดงออกปกติ GNU (ในgrep/ sed... ) หรือในขณะที่fnmatch()find -name
นอกจากนี้ยังหมายความว่าสิ่งที่[A-Z]ตรงกันต่างกันไปตามสภาพแวดล้อมกับระบบปฏิบัติการและรุ่นของระบบปฏิบัติการ ความจริงที่[A-Z]ตรงกับÁ แต่ไม่ใช่Źนั้นก็ไม่ได้ผลเช่นกัน
สำหรับzsh/ yashเราใช้ลำดับการจัดเรียงที่แตกต่างกัน แทนที่จะพึ่งพาความคิดของผู้ใช้เกี่ยวกับลำดับตัวอักษรเราใช้ค่ารหัสจุดอักขระ มันมีประโยชน์ในการเข้าใจง่าย แต่จากจุดที่มีประโยชน์น้อยนอกเหนือจาก ASCII มันไม่ได้มีประโยชน์มาก [A-Z]ตรงกับตัวอักษรตัวพิมพ์ใหญ่ภาษาอังกฤษแบบอเมริกัน 26 ตัว[0-9]ตรงกับตัวเลขทศนิยม มีจุดรหัสใน Unicode ที่เป็นไปตามลำดับของตัวอักษรบางตัว แต่นั่นไม่ใช่แบบทั่วไปและไม่สามารถเป็นแบบทั่วไปได้อย่างไรก็ตามคนอื่นที่ใช้สคริปต์เดียวกันไม่จำเป็นต้องเห็นด้วยกับลำดับตัวอักษร
สำหรับเชลล์แบบดั้งเดิมและ mksh ให้ใช้งานไม่ได้ (ตอนนี้คนส่วนใหญ่ใช้อักขระหลายไบต์) แต่ส่วนใหญ่เป็นเพราะพวกเขายังไม่รองรับหลายไบต์ การเพิ่มการสนับสนุนหลายไบต์ให้กับเชลล์เช่นนี้bashและzshเป็นความพยายามอย่างมากและยังคงดำเนินอยู่ yash(เชลล์ญี่ปุ่น) เริ่มแรกด้วยการสนับสนุนหลายไบต์ตั้งแต่เริ่มต้น
วิธีการของ ksh93 มีประโยชน์ที่จะสอดคล้องกับการแสดงออกปกติของระบบหรือ fnmatch () (หรืออย่างน้อยก็ปรากฏเป็นอย่างน้อยในระบบ GNU) ที่นั่นจะไม่ทำลายความคาดหวังของบางคนเนื่องจาก[A-Z]ไม่มีตัวอักษรตัวพิมพ์เล็ก[A-Z]รวมถึงÉ(และÁ แต่ไม่ใช่Ź) มันไม่สอดคล้องกับคำสั่งsortหรือโดยทั่วไปstrcoll()
localeเอาท์พุท? ฉันไม่สามารถทำซ้ำสิ่งนี้ (touch foo; echo [A-Z]*แสดงรูปแบบตัวอักษรไม่ใช่ "foo" ในไดเรกทอรีว่างเปล่า)