echo [9876543210] แสดง 1 4 5 6 …ทำไม?


19

โปรดอธิบายว่าทำไม 1 4 5 6 แสดงเป็นคำสั่ง echo สี่ครั้งล่าสุด ฉันตีมันโดยบังเอิญครั้งเดียว แต่ตอนนี้ฉันอยากรู้ว่าทำไมพฤติกรรมนี้เกิดขึ้น

ข้อความเหล่านี้ทำงานได้ตามที่คาดไว้ (สำหรับฉัน)

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

ข้อความสะท้อนเหล่านี้แสดงอย่างต่อเนื่อง 1 4 5 6. มีอะไรพิเศษเกี่ยวกับตัวเลขเหล่านี้หรือไม่?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

ขอบคุณ!

  • การทำซ้ำที่เป็นไปได้เกี่ยวข้องและมีประโยชน์ แต่ไม่ซ้ำกัน ความซ้ำซ้อนที่เป็นไปได้นั้นมาจากมุมมองของrmคำสั่ง คำถามนี้มาจากมุมมองของการรับรู้ "พฤติกรรมแปลก ๆ " ของechoคำสั่ง คำตอบพื้นฐานสำหรับทั้งสองคือกลม บางคนกำลังค้นหาปัญหาด้วยechoคำสั่งจะไม่สามารถค้นหาrmคำถามได้ง่ายแต่มีแนวโน้มที่จะมาที่นี่

16
คุณมี 4 ไฟล์ในไดเรกทอรีปัจจุบันของคุณชื่อ: 1 4 5และ6
Jeff Schaller

5
ฮ่า ๆ บอทที่metasmoke.erwaysoftware.com/post/58973 ทำเครื่องหมายว่าโพสต์นี้เป็นสแปมเพราะ "มีหมายเลขโทรศัพท์ในชื่อ" ... จริงเหรอ?
คาร์โลวู้ด

2
@CarloWood ตัวเลขสิบหลักติดต่อกันตรงกับหมายเลขโทรศัพท์ในสหรัฐอเมริกาที่มีรหัสพื้นที่ เขียนโดยใช้การจัดรูปแบบปกติจะเป็น 987-654-3210
ทำเครื่องหมาย

1
โปรดทราบว่าหากคุณเปิดใช้nullglobงานตัวอย่างที่สองของคุณ ( echo [237890]) จะไม่พิมพ์อะไรเลยซึ่งอาจเป็นสัญญาณที่บ่งบอกว่าคุณเห็นการขยายตัวของ glob ในตัวอย่างอื่น
Kyle Strand

3
ซ้ำซ้อนที่เป็นไปได้ของการทำงานของ rm / ls ด้วย [0-9]
muru

คำตอบ:


33

วงเล็บเปิด[เป็นอักขระพิเศษของเชลล์ มันเปิดอัลกอริทึมการจับคู่รูปแบบที่ระบุว่า "จับคู่อักขระใด ๆ ภายในวงเล็บเหลี่ยม" เนื่องจากคุณมี 4 ไฟล์ชื่อ: 1, 4, 5 และ 6 ในไดเรกทอรีปัจจุบันของคุณเมื่ออักขระภายในวงเล็บมีตัวเลขใด ๆ เหล่านั้นเชลล์ของคุณจะแทนที่รูปแบบการจับคู่กับชื่อไฟล์เหล่านั้น เมื่อคุณใช้แทนecho [ 9876543210 ]คุณโทรก้อง 3 พารามิเตอร์[, และ9876543210]

คุณควรอ้างอิงพารามิเตอร์ของคำสั่ง echo เพื่อป้องกันเชลล์ไม่ให้เห็นว่ามันเป็นคำขอจับคู่รูปแบบ

$ echo '[9876543210]'
[9876543210]

(หรือลบไฟล์ที่ชื่อ 1, 4, 5 และ 6 - แต่นั่นเป็นวิธีแก้ปัญหาเพื่อแสดงให้เห็นถึงพฤติกรรมไม่ใช่การแก้ไข)


4
อาจจะเป็นการดีกว่าถ้าจะพูดว่าการecho [ 987 ]เรียกที่echoมีสามพารามิเตอร์มากกว่าที่จะพูดถึงtest?
dhag

2
มันจะแน่นอน! ฉันตอบมากเกินไป :(
Jeff Schaller

1
* ฉันยังชอบเวอร์ชันคำตอบแรกของคุณเนื่องจากฉันพบข้อผิดพลาดครั้งแรกในขณะที่ลองใช้คำสั่ง echo เพื่อทดสอบต่างๆ
MikeD

1
คำตอบเดิมไม่ได้เป็นจริง เขาเขียนว่า: echo [9876543210] ไม่มีการวิงวอนของ [(เช่นทดสอบ))
knezi

จุดสำคัญคือการโต้แย้งที่echoจะตีความแตกต่างกันโดยbashขึ้นอยู่กับว่ามีช่องว่างระหว่างวงเล็บเหลี่ยมและสิ่งที่อยู่ภายในพวกเขา [123]กับ[ 123 ].
jskroch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.