echo [9876543210] menampilkan 1 4 5 6 ... mengapa?

19

Tolong jelaskan mengapa 1 4 5 6 ditampilkan untuk empat pernyataan gema terakhir? Saya pernah mengalami hal ini secara tidak sengaja, tetapi saya sekarang penasaran mengapa perilaku ini terjadi.

Pernyataan ini berfungsi seperti yang diharapkan (untuk saya).

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

Pernyataan gema ini secara konsisten menampilkan 1 4 5 6. Apakah ada sesuatu yang istimewa tentang angka-angka ini?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

Terima kasih!

  • Kemungkinan duplikat terkait dan bermanfaat, tetapi bukan duplikat. Duplikat yang mungkin adalah dari perspektif rmperintah. Pertanyaan ini dari sudut pandang "perilaku aneh" yang dirasakan dari suatu echoperintah. Jawaban yang mendasari untuk keduanya adalah globbing. Seseorang yang mencari masalah dengan echoperintah tidak akan dengan mudah menemukan rmpertanyaan, tetapi akan lebih cenderung mendarat di sini.
MikeD
sumber
16
Anda memiliki 4 file di direktori Anda saat ini, bernama: 1 4 5and6
Jeff Schaller
5
Lol, bot di metasmoke.erwaysoftware.com/post/58973 menandai posting ini sebagai spam karena "memiliki nomor telepon dalam judul" ... benarkah?
Carlo Wood
2
@CarloWood, sepuluh digit berturut-turut cocok dengan nomor telepon Amerika Serikat dengan kode area. Ditulis menggunakan pemformatan normal, itu akan menjadi 987-654-3210.
Tandai
1
Perhatikan bahwa jika Anda menghidupkan nullglob, contoh kedua Anda ( echo [237890]) sebenarnya tidak akan mencetak apa-apa, yang bisa menjadi petunjuk bahwa Anda melihat ekspansi global dalam contoh lainnya.
Kyle Strand
3
Kemungkinan rangkap dari Bekerja rm / ls dengan [0-9]
muru

Jawaban:

33

Braket terbuka [adalah karakter khusus untuk shell; itu membuka algoritma pencocokan pola yang mengatakan "cocok dengan salah satu karakter di dalam tanda kurung". Karena Anda memiliki 4 file bernama: 1, 4, 5, dan 6 di direktori Anda saat ini, ketika karakter di dalam tanda kurung berisi salah satu dari angka-angka itu, shell Anda mengganti pola-cocok dengan nama file tersebut. Bila Anda bukan menggunakan echo [ 9876543210 ]Anda panggil gema dengan 3 parameter: [, 9876543210, dan ].

Anda harus mengutip parameter pernyataan gema Anda untuk mencegah shell melihatnya sebagai permintaan pencocokan pola.

$ echo '[9876543210]'
[9876543210]

(atau hapus file bernama 1, 4, 5, dan 6 - tapi itu solusi untuk menunjukkan perilaku, bukan perbaikan).

Jeff Schaller
sumber
4
Mungkin akan lebih baik untuk mengatakan bahwa echo [ 987 ]panggilan echodengan tiga parameter daripada menyebutkan test?
Dhag
2
memang akan! Saya terlalu banyak menjawab :(
Jeff Schaller
1
* Saya juga suka versi jawaban pertama Anda, karena saya awalnya berlari melintasi ini saat mencoba pernyataan gema dari berbagai tes.
MikeD
1
Jawaban aslinya bahkan tidak benar. Dia menulis: echo [9876543210]. Tidak ada permohonan [(dengan demikian tes) dilakukan.
knezi
Poin kuncinya adalah bahwa argumen untuk echoditafsirkan berbeda dengan bashbergantung pada apakah ada ruang antara tanda kurung siku dan apa yang ada di dalamnya. [123]vs. [ 123 ].
jskroch