Como usar a expansão do Brace no Bash Shell do Linux

Uma janela de terminal em um sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

A expansão de chaves é uma técnica útil para gerar listas de strings que podem ser usadas em scripts e aliases e na linha de comando do Linux. Economize tempo e evite erros digitando menos.

Expansão da cinta

Antes de o shell Bash executar um comando em uma janela de terminal ou uma linha em um script, ele verifica se precisa realizar alguma substituição no comando. Os nomes das variáveis ​​são substituídos por seus valores, os aliases são substituídos pelos comandos para os quais são abreviados e qualquer expansão é executada. A expansão de chaves é uma forma de expansão suportada pelo Bash.

A expansão de suporte está disponível em shells modernos, mas pode não estar presente em alguns shells antigos. Se você for usar a expansão de chaves em scripts, certifique-se de invocar um shell que suporte a expansão de chaves, como Bash:

Estaremos usando o Bash para nossos exemplos.

Gerar listas de strings pode parecer mais uma novidade do que um benefício, mas oferece algumas funcionalidades que podem economizar tempo e digitar. Freqüentemente, pode fornecer uma solução simples e elegante para um problema ou requisito.

Expansões Simples

Uma expansão de chave está contida entre um par de chaves “{}”. Pode ser uma lista de itens separados por vírgulas ou um especificador de intervalo. Espaços não são permitidos entre colchetes, a menos que você tenha colocado a string entre aspas “ ".”

Para uma lista separada por vírgulas, o processo de expansão pega cada elemento por vez e passa para o comando de chamada. Neste exemplo, ele echo simplesmente os imprime na janela do terminal . Observe que as vírgulas são ignoradas.

echo {um, dois, três, quatro}

Uma lista pode ser composta por palavras ou dígitos.

echo {1,2,3,4}

A ordem dos elementos da lista é completamente arbitrária.

eco (4,2,3,1)

Um intervalo de expansão tem um caractere inicial e um caractere final conectados com dois pontos ” ..” sem nenhum espaço em branco. Todos os elementos da lista que faltam são fornecidos automaticamente pela expansão, de forma que todo o intervalo, do caractere inicial ao caractere final, seja criado.

Recomendado:  Evite a oficina, você pode decodificar uma luz de verificação do motor em casa

Isso imprimirá os dígitos de 1 a 10.

echo {1..10}

A numeração é arbitrária. Não precisa começar em um.

echo {3..12}

Os intervalos podem ser especificados para que sejam executados ao contrário. Isso irá gerar uma lista de cinco a um.

echo {5..1}

Os intervalos podem incluir números negativos.

echo {4 ..- 4}

Como já anteriormente apontado, uma gama tem um começo e um fim caráter . Não precisa ser um número. Pode ser uma carta.

echo {q..v}

As letras também podem correr ao contrário.

echo {f..a}

Usando a Expansão de Brace com Loops

Você pode usar a expansão de chaves com intervalos em loops em scripts.

para mim em {3..7}
Faz
   echo $ i
feito

Os intervalos de expansão de chaves permitem que você use caracteres como a variável de loop.

para i em {m..q}
Faz
   echo $ i
feito

Os loops são geralmente usados ​​em scripts, mas não há nada que o impeça de digitá-los na linha de comando para ver o que acontecerá.

para i em {3..7}; faça echo $ i; feito

para i em {m..q}; faça echo $ i; feito

Concatenando e aninhando

Duas expansões adjacentes não agem independentemente uma após a outra. Eles interoperam. Cada elemento na primeira expansão é influenciado por cada elemento na segunda expansão.

echo {q..v} {1..3}

As expansões também podem ser aninhadas. Uma expansão aninhada atuará no elemento imediatamente anterior.

echo {parte 1, parte 2 {a, b, c, d}, parte 3}

Você também pode aninhar expansões criando uma lista delimitada por vírgulas de expansões de intervalo.

echo {{5..0}, {1..5}}

Preâmbulo e PostScript

Você pode colocar o texto antes e depois de uma expansão de chave para que esse texto seja incluído nos resultados da expansão. O texto colocado na frente de uma expansão é chamado de preâmbulo, enquanto o texto colocado atrás de uma expansão de colchete é chamado de pós-escrito.

Recomendado:  Como reduzir o brilho do seu iPhone abaixo do permitido pelo iOS

Este comando usa um preâmbulo.

capítulo de eco {1..3}

Este exemplo usa um postscript:

echo {conteúdo, artigo, bilbiografia} .md

E este comando usa ambos.

capítulo de eco- {1..4} .md

Expandindo nomes de arquivos e diretórios

Como você provavelmente já deve ter adivinhado, um dos principais usos das expansões de chaves é criar nomes de arquivos e diretórios que podem ser passados ​​para outros comandos. Temos usado echouma maneira conveniente de ver exatamente o que acontece quando uma expansão é acionada. Você pode substituir qualquer comando que receba nomes de arquivos ou diretórios como entrada e usar a expansão de chaves com ele.

Para criar alguns arquivos rapidamente , use touch:

toque em arquivo- {1..4} .txt
ls * .txt

Se você tiver muitos arquivos com o mesmo nome de base, mas com extensões de arquivo diferentes, e quiser realizar uma operação em um subconjunto deles, as expansões de chaves podem ajudar. Aqui, estamos compactando um subconjunto de arquivos que têm “programa” como o nome de base em um arquivo ZIP chamado “código-fonte.zip”.

Os diretórios de desenvolvimento contêm muitos arquivos que terão o mesmo nome de base do seu programa principal. Normalmente, você não deseja fazer backup ou distribuir arquivos como arquivos de objeto “.o”. Esta é uma maneira interessante de incluir apenas os tipos de arquivo de interesse.

programa de código-fonte zip {.c, .h, .css}

Este comando fará uma cópia de um arquivo e anexará “.bak” a ele, fazendo uma cópia de backup do arquivo original. Um ponto interessante a notar é que a expansão da chave contém uma lista separada por vírgulas, mas o primeiro elemento está vazio. Se não tivéssemos incluído a vírgula, a expansão não teria ocorrido.

cp brace / new / prog-1.c {,. bak}
ls brace / new / prog-1.c.bak

Para realizar alguma ação em dois arquivos em diretórios diferentes, podemos usar uma expansão de chave no caminho para os arquivos.

Recomendado:  Nós realmente precisamos de um emoji para cada objeto na Terra?

Neste exemplo, o diretório “brace” contém dois subdiretórios, um denominado “novo” e outro denominado “antigo”. Eles contêm versões diferentes do mesmo conjunto de arquivos de código-fonte. Usaremos o diffprograma para ver as diferenças entre as duas versões de “prog-1.c.”

chave diferencial / {novo, antigo} /prog-1.c

Se você tiver um esqueleto padrão de diretórios que precisa ser criado no início de um projeto, poderá criá-los rapidamente usando a expansão de chaves. mkdir -popção (pai) cria qualquer diretório pai ausente quando um diretório filho é criado.

mkdir -p {source, build, man, help {/ pages, / yelp, / images}}
árvore

Você pode usar a expansão de suporte  wgetpara baixar vários arquivos .

Neste comando, vamos baixar arquivos de dois diretórios, chamados “test1” e “test2.” Cada diretório contém dois arquivos chamados “imagem1” e “imagem2”.

wget https://www.URL-of-your-choice.com/test{1,2}/picture{001,002}.jpg

Listar os arquivos mostra os arquivos que foram recuperados e como os wget renomeia para evitar conflitos de nome com os arquivos existentes.

ls imagem *. *

Abrace o Brace

Parece que a expansão da braçadeira é outro dos segredos mais bem guardados do Linux . Muitas pessoas me dizem que nunca ouviram falar de expansão de chaves, enquanto outras me informam que é um de seus truques de linha de comando favoritos.

Experimente e ele poderá encontrar seu caminho em seu conjunto de truques de linha de comando.