-
{}
é chamado de expansão de chave. Ele tem duas formas:{x..y}
e{x,y}
, substituax
ey
por qualquer valor alfabético ou numérico.No primeiro formulário,
{x..y}
será expandido para todos os valores dex
ay
, inclusive. Por exemplo,{2..5}
será expandido para2
,3
,4
,5
.No segundo formulário explícito,
{x,y}
será expandido para apenasx
,y
. Por exemplo,{2,5}
será expandido para2
e5
.Se não for possível expansão, o padrão é tratado literalmente, e. em
{a..3}
.É importante notar que a expansão da chave será feita (se possível), independentemente de qualquer correspondência de arquivo, enquanto na criação / correspondência de arquivos.
-
[]
é conhecido como um padrão de expansão de nome de caminho (ou globbing). Ao contrário da expansão de chaves, você só pode usá-la enquanto combina nomes de arquivos, e ela será tratada literalmente se você usá-la durante a criação de arquivos.Tem duas formas:
[xyz...]
e[x-y]
.No primeiro formulário, ele corresponderá a qualquer caractere individual dentro dos colchetes separadamente, ou seja, cada personagem é tratado individualmente. Portanto, para
[25].txt
, ele corresponderá a um arquivo chamado2.txt
ou5.txt
no diretório atual, enquanto que para[245].txt
ele corresponderá a qualquer arquivo chamado2.txt
ou4.txt
ou5.txt
.No segundo formulário, uma expansão de intervalo é feita primeiro antes de corresponder individualmente, se possível, tratada de outra forma literalmente. Portanto, para
[2-5]. txt
, ele corresponderá a qualquer arquivo chamado2.txt
ou3.txt
ou4.txt
ou5.txt
. Se o intervalo não puder ser expandido, será tratado literalmente, e. no caso de[a-3].txt
.
Uma diferença comportamental importante entre esses dois é quando há mais padrões para corresponder, enquanto menos na verdade é correspondido. Como a expansão da chave é feita, não importa qual, ele mostrará o erro de que certos arquivos não existem enquanto a expansão do nome do caminho corresponder ao que for possível sem qualquer erro para o resto:
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
Nota de portabilidade:
O operador de expansão []
nome do caminho é definido pelo POSIX, portanto, portável entre o shell Bourne e derivados.
A expansão da chave, {}
, não é definida pelo POSIX, portanto, não é portável entre todos os shells. Por exemplo, dash
( sh
no Ubuntu) não tem isso. Ele foi emprestado de csh
e funcionará apenas em alguns shells, por ex. bash
, zsh
, ksh93
, fish
. Certifique-se de que o shell que você está usando suporta isso antes de implementá-lo.
Exemplo:
$ touch {1..3}.txt
$ ls {1..3}.txt
1.txt 2.txt 3.txt
$ ls {1,2,3}.txt
1.txt 2.txt 3.txt
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory
$ ls [123].txt
1.txt 2.txt 3.txt
$ ls [1-3].txt
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory