Какой символ подстановки в командной оболочке bash соответствует любому одному символу при работе с именами файлов?
Подробное объяснение
В bash для glob-подстановок символ '?' соответствует ровно одному любому символу в имени файла или строке. Например, шаблон 'file?.txt' найдет 'file1.txt', 'fileA.txt', но не 'file10.txt', так как после 'file' должен быть ровно один символ перед расширением. Это отличается от символа '*', который соответствует любой последовательности символов (включая пустую строку), и от других символов, которые не являются стандартными подстановочными знаками для одиночных символов в bash.
Часто задаваемые вопросы (FAQ)
1
Чем отличается символ '?' от '*' в bash?
Символ '?' соответствует ровно одному любому символу, тогда как '*' соответствует любой последовательности символов (включая пустую). Например, 'file?.txt' найдет 'file1.txt', а 'file*.txt' найдет 'file.txt', 'file123.txt' и т.д.
2
Можно ли использовать символ '?' для соответствия нескольким символам?
Нет, каждый символ '?' в шаблоне соответствует ровно одному символу. Для соответствия нескольким символам нужно использовать несколько '?' подряд (например, 'file??.txt' для двух символов) или символ '*'.
3
Работает ли символ '?' только с именами файлов?
В основном он используется для glob-подстановок с именами файлов, но также может применяться в других контекстах bash, например, в условных выражениях или при работе со строками, где поддерживается подстановка по шаблону.
Типичные ошибки
1
Использование символа '*' вместо '?' для соответствия одному символу
Символ '*' соответствует любой последовательности символов, включая пустую, поэтому он может найти больше файлов, чем требуется, если нужно строго односимвольное соответствие.
2
Путаница с символами из регулярных выражений (например, '.')
В регулярных выражениях точка '.' соответствует одному символу, но в bash glob-подстановках используется '?'. Использование '.' в шаблонах bash не даст ожидаемого результата подстановки.
3
Считают, что символ '?' соответствует нулю или одному символу
В bash символ '?' всегда соответствует ровно одному символу, а не нулю или одному. Для соответствия нулю или одному символу нужно использовать другие конструкции, например, расширенные шаблоны с '?(pattern)'.