echo [9876543210] hiển thị 1 4 5 6, tại sao?


19

Hãy giải thích tại sao 1 4 5 6 được hiển thị cho bốn câu lệnh echo cuối cùng? Tôi đã vô tình gặp phải điều này một lần, nhưng bây giờ tôi tò mò về lý do tại sao hành vi này xảy ra.

Những tuyên bố này hoạt động như mong đợi (đối với tôi).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Các báo cáo tiếng vang này luôn hiển thị 1 4 5 6. Có điều gì đặc biệt về những con số này không?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Cảm ơn!

  • Bản sao có thể có liên quan và hữu ích, nhưng không phải là bản sao. Sự trùng lặp có thể là từ quan điểm của một rmlệnh. Câu hỏi này là từ quan điểm của một "hành vi kỳ lạ" nhận thức của một echolệnh. Câu trả lời cơ bản cho cả hai là Globing. Ai đó đang tìm kiếm các vấn đề với một echolệnh sẽ không dễ dàng tìm thấy rmcâu hỏi, nhưng nhiều khả năng sẽ hạ cánh ở đây.

16
bạn có 4 tệp trong thư mục hiện tại của mình, được đặt tên: 1 4 56
Jeff Schaller

5
Lol, bot tại metasmoke.erwaysoftware.com/post/58973 đánh dấu bài đăng này là thư rác vì nó "có số điện thoại trong tiêu đề" ... thật sao?
Carlo Wood

2
@CarloWood, mười chữ số liên tiếp khớp với số điện thoại của Hoa Kỳ với mã vùng. Được viết bằng định dạng thông thường, nó sẽ là 987-654-3210.
Đánh dấu

1
Lưu ý rằng nếu bạn bật nullglob, ví dụ thứ hai ( echo [237890]) của bạn sẽ thực sự không in gì, đó có thể là đầu mối mà bạn đang thấy mở rộng toàn cầu trong các ví dụ khác.
Kyle Strand

3
Bản sao có thể hoạt động của rm / ls với [0-9]
muru

Câu trả lời:


33

Khung mở [là một ký tự đặc biệt cho vỏ; nó mở ra một thuật toán khớp mẫu có nội dung "khớp bất kỳ ký tự nào trong dấu ngoặc". Vì bạn có 4 tệp có tên là: 1, 4, 5 và 6 trong thư mục hiện tại của bạn, khi các ký tự bên trong ngoặc chứa bất kỳ chữ số nào, vỏ của bạn sẽ thay thế khớp mẫu với các tên tệp đó. Khi bạn thay vì sử dụng echo [ 9876543210 ]bạn đang gọi tiếng vang với 3 thông số: [, 9876543210, và ].

Bạn nên trích dẫn các tham số của câu lệnh echo để ngăn shell xem nó như một yêu cầu khớp mẫu.

$ echo '[9876543210]'
[9876543210]

(hoặc xóa các tệp có tên 1, 4, 5 và 6 - nhưng đó là cách giải quyết để thể hiện hành vi, không phải là sửa lỗi).


4
Có lẽ sẽ tốt hơn để nói rằng echo [ 987 ]các cuộc gọi echovới ba tham số hơn là đề cập đến test?
dhag

2
Nó thực sự sẽ! Tôi đã trả lời quá mức :(
Jeff Schaller

1
* Tôi cũng thích phiên bản trả lời đầu tiên của bạn, vì ban đầu tôi đã chạy qua điều này trong khi thử các phát biểu tiếng vang của các bài kiểm tra khác nhau.
MikeD

1
Câu trả lời ban đầu thậm chí không đúng. Ông viết: tiếng vang [9876543210]. Không có yêu cầu [(do đó kiểm tra) được thực hiện.
knezi

Điểm mấu chốt là đối số echođược diễn giải khác nhau bashtùy thuộc vào việc có hay không có khoảng trắng giữa dấu ngoặc vuông và những gì bên trong chúng. [123]vs [ 123 ].
jskroch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.