Я создал три файла в своем каталоге с помощью команды touch inv{1..3}.txt
. Теперь я использовал две команды, и их вывод практически одинаков. Эти две команды ls inv[13].txt
и ls {1,3}.txt
.
Так как же эти два разных? Чем квадратные скобки отличаются от фигурных скобок? Кроме того, я гуглил «linux [..]», но ничего не смог найти, так мог ли я узнать, как эти вещи называются в терминологии linux?
Спасибо
command-line
bash
scripts
posixKing
источник
источник
{}
и Расширение имени файла> Pattern Matching for[]
.Ответы:
{}
называется расширение скобки. Он имеет две формы:{x..y}
и{x,y}
, заменитьx
иy
любым буквенным или числовым значением.В первой форме
{x..y}
будут развернуты все значения отx
доy
, включительно. Например,{2..5}
будет расширена2
,3
,4
,5
.Во втором явном виде,
{x,y}
будет расширена толькоx
,y
. Например,{2,5}
будет расширен до2
и5
.Если расширение невозможно, шаблон обрабатывается буквально, например, в
{a..3}
.Важно отметить, что расширение фигурных скобок будет выполнено (если возможно) независимо от совпадения файлов при создании / сопоставлении файлов.
[]
известен как шаблон расширения (или глобализации) пути. В отличие от расширения скобки, вы можете использовать его только при сопоставлении имен файлов, оно будет обрабатываться буквально, если вы используете его при создании файлов.Он имеет две формы:
[xyz...]
и[x-y]
.В первой форме он будет соответствовать любому отдельному символу в квадратных скобках отдельно, т.е. каждый символ обрабатывается индивидуально. Так что для
[25].txt
него будет соответствовать файл с именем2.txt
или5.txt
в текущем каталоге, в то время как для[245].txt
него будет соответствовать любой файл с именем2.txt
или4.txt
или5.txt
.Во второй форме расширение диапазона выполняется в первую очередь перед сопоставлением по отдельности, если это возможно, трактуется буквально. Таким образом
[2-5]. txt
, он будет соответствовать любому файлу с именем2.txt
или3.txt
или4.txt
или5.txt
. Если диапазон не может быть расширен, он будет рассматриваться буквально, например, в случае[a-3].txt
.Важное поведенческое различие между этими двумя аспектами заключается в том, что существует больше образцов для сопоставления, в то время как на самом деле сопоставляется меньшее. Поскольку расширение фигурной скобки выполняется независимо от того, что, это покажет ошибку, что определенные файлы не существуют, в то время как расширение имени пути будет соответствовать любому возможному без какой-либо ошибки для остальных:
Примечание по мобильности:
Оператор
[]
раскрытия пути определяется POSIX и, следовательно, переносим среди оболочки Bourne и ее производных.Расширение скобки,
{}
не определяется POSIX, поэтому не переносимо среди всех оболочек. Например,dash
(sh
в Ubuntu) этого нет. Он был заимствован изcsh
и будет работать на некоторых оболочках только напримерbash
,zsh
,ksh93
,fish
. Убедитесь, что используемая оболочка поддерживает это, прежде чем внедрять.Пример:
источник
[
]
расширения при отсутствии совпадений, поскольку оно может различаться в зависимости от конфигурации оболочки. Если вы хотите использовать[
или]
в имени файла, оно должно быть указано в ваших командах. Также стоит заметить разницу между{13..79}
и[13-79]
. Первым будет производить все числа в диапазоне от13
до79
, то второй будет соответствовать символам1
,3
,4
,5
,6
,7
, и9
.nullglob
(или аналогичного). О[13-79]
сопоставлении, я думаю, я четко упомянул в своем ответе о поведении каждого персонажа в [] `.ksh
имеет эту особенность, но не более современные ароматы, такие как mksh и pkdshКлючевое различие между этими двумя формами иллюстрируется здесь:
inv[15].txt
является глобальным и расширит список подходящих файлов в вашей файловой системе. Это расширение пути .inv{1,5}.txt
расширяетсяinv1.txt
иinv5.txt
независимо от того, какие файлы на самом деле находятся в вашей файловой системе. Это расширение скобки .источник
ba{con,tman}
и нет эквивалента в квадратных скобках. IOW, расширение скобки не только для отдельных символов.