echo [9876543210] wyświetla 1 4 5 6… dlaczego?

19

Proszę wyjaśnić, dlaczego 1 4 5 6 jest wyświetlany dla ostatnich czterech instrukcji echa? Uderzyłem to raz przypadkiem, ale teraz jestem ciekawy, dlaczego tak się dzieje.

Te instrukcje działają zgodnie z oczekiwaniami (dla mnie).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Te instrukcje echa konsekwentnie wyświetlają 1 4 5 6. Czy jest coś specjalnego w tych liczbach?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Dzięki!

  • Możliwy duplikat jest powiązany i pomocny, ale nie duplikat. Możliwy duplikat jest z perspektywy rmpolecenia. To pytanie jest z perspektywy postrzeganego „dziwnego zachowania” echopolecenia. Podstawową odpowiedzią na oba są globbing. Ktoś szukający problemów z echopoleceniem nie znalazłby łatwo rmpytania, ale raczej trafiłby tutaj.
MikeD
źródło
16
masz 4 pliki w bieżącym katalogu o nazwie: 1 4 5i6
Jeff Schaller
5
Lol, bot z metasmoke.erwaysoftware.com/post/58973 zaznacza ten post jako spam, ponieważ „ma numer telefonu w tytule”… naprawdę?
Carlo Wood,
2
@CarloWood, dziesięć kolejnych cyfr odpowiada numerowi telefonu w Stanach Zjednoczonych z numerem kierunkowym. Napisany przy użyciu normalnego formatowania będzie to 987-654-3210.
Mark
1
Zauważ, że jeśli włączysz nullglob, twój drugi przykład ( echo [237890]) nie wydrukuje niczego, co mogłoby być wskazówką, że widziałeś ekspansję globalną w innych przykładach.
Kyle Strand
3
Możliwy duplikat działania rm / ls z [0-9]
muru

Odpowiedzi:

33

Otwarty nawias [to specjalny znak dla powłoki; otwiera algorytm dopasowania wzorca, który mówi „dopasuj dowolny ze znaków w nawiasach”. Ponieważ masz 4 pliki o nazwach: 1, 4, 5 i 6 w bieżącym katalogu, gdy znaki w nawiasach zawierają dowolne z tych cyfr, twoja powłoka zastępuje dopasowanie wzorca tymi nazwami plików. Kiedy zamiast używać echo [ 9876543210 ]dzwonisz echo z 3 parametrów: [, 9876543210, i ].

Powinieneś zacytować parametry instrukcji echo, aby powłoka nie widziała jej jako żądania dopasowania wzorca.

$ echo '[9876543210]'
[9876543210]

(lub usuń pliki o nazwach 1, 4, 5 i 6 - ale jest to obejście mające na celu wykazanie zachowania, a nie poprawka).

Jeff Schaller
źródło
4
Być może lepiej byłoby powiedzieć, że echo [ 987 ]połączenia echoz trzema parametrami niż nawet wspomnieć test?
dhag
2
tak by było! Nadmiernie odpowiedziałem :(
Jeff Schaller
1
* Podoba mi się również twoja pierwsza odpowiedź, ponieważ początkowo natknąłem się na nią podczas wypróbowywania instrukcji echa różnych testów.
MikeD
1
Oryginalna odpowiedź nie jest nawet prawdziwa. Napisał: echo [9876543210]. Żadne wywołanie [(a więc test) nie jest wykonywane.
knezi
Kluczową kwestią jest to, że argument do echointerpretuje się różnie, bashzależnie od tego, czy między nawiasami kwadratowymi są odstępy, a tym, co się w nich znajduje. [123]vs [ 123 ].
jskroch