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питання, але скоріше за все тут.

16
у вашому поточному каталозі 4 файли з назвою: 1 4 5і6
Jeff Schaller

5
Лол, бот на metasmoke.erwaysoftware.com/post/58973, позначає цю публікацію як спам, оскільки у неї "номер телефону в заголовку" ... справді?
Карло Вуд

2
@CarloWood, десять поспіль цифр збігається з номером телефону США та кодом міста. Написаний у звичайному форматуванні, це було б 987-654-3210.
Марк

1
Зауважте, що якщо ви ввімкнете nullglob, ваш другий приклад ( echo [237890]) насправді нічого не надрукує, що могло б бути підказкою, що ви бачили глобальне розширення в інших прикладах.
Кайл Странд

3
Можливий дублікат роботи rm / ls з [0-9]
muru

Відповіді:


33

Відкрита дужка [- особливий символ оболонці; він відкриває алгоритм відповідності шаблону, який говорить "відповідати будь-якому з символів всередині дужок". Оскільки у вашому поточному каталозі є 4 файли, названі як: 1, 4, 5 та 6, коли символи, що знаходяться в дужках, містять будь-яку з цих цифр, ваша оболонка заміняє відповідність шаблону тим файлам. Коли ви замість того, щоб використовувати echo [ 9876543210 ]ви викликаєте відлуння з 3 параметрами: [, 9876543210і ].

Ви повинні вказати параметри заяви оператора ехо, щоб оболонка не бачила його як запит відповідності шаблону.

$ echo '[9876543210]'
[9876543210]

(або видаліть файли з іменами 1, 4, 5 і 6 - але це рішення для демонстрації поведінки, а не виправлення).


4
Можливо, було б краще сказати, що echo [ 987 ]дзвінки echoз трьома параметрами, ніж навіть згадувати test?
даг

2
це справді! Я заперечно відповів :(
Джефф Шаллер

1
* Мені також подобається ваша перша версія відповідей, оскільки я спочатку натрапляв на це, намагаючись повторювати твердження різних тестів.
MikeD

1
Оригінальна відповідь навіть не відповідає дійсності. Він писав: ехо [9876543210]. Викликання [(таким чином тестування) не робиться.
knezi

Ключовим моментом є те, що аргумент до echoінтерпретується по-різному bashзалежно від того, чи є проміжки між квадратними дужками і тим, що знаходиться всередині них. [123]проти [ 123 ].
jskroch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.