echo [9876543210] отображает 1 4 5 6… почему?

19

Пожалуйста, объясните, почему 1 4 5 6 отображается для последних четырех эхо-операторов? Однажды я столкнулся с этим случайно, но теперь мне интересно, почему это происходит.

Эти заявления работают, как и ожидалось (для меня).

$ 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вопрос, но, скорее всего, приземлится здесь.
MikeD
источник
16
у вас есть 4 файла в вашем текущем каталоге с именем: 1 4 5и6
Джефф Шаллер
5
Lol, бот в metasmoke.erwaysoftware.com/post/58973 помечает это сообщение как спам, потому что у него "есть номер телефона в заголовке" ... правда?
Карло Вуд
2
@CarloWood, десять цифр подряд соответствуют номеру телефона США с кодом города. Написано с использованием обычного форматирования, это будет 987-654-3210.
Mark
1
Обратите внимание, что если вы включите nullglob, ваш второй пример ( echo [237890]) на самом деле ничего не напечатает, что могло бы быть подсказкой того, что вы видели расширение glob в других примерах.
Кайл Стрэнд
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?
Дхаг,
2
это действительно так! Я переоценил :(
Джефф Шаллер
1
* Мне также нравится ваша первая версия ответа, так как я сначала наткнулся на это, пробуя выражения эха различных тестов.
MikeD
1
Оригинальный ответ даже не соответствует действительности. Он написал: эхо [9876543210]. Вызов [(таким образом, test) не выполняется.
knezi
Ключевым моментом является то, что аргумент для echoинтерпретируется по-разному в bashзависимости от того, есть ли пробелы между квадратными скобками и что внутри них. [123]против [ 123 ].
Jskroch