Expansão da chaves no BASH
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.
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 apontamos anteriormente, um intervalo tem um caractere inicial e um caractere final . 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} do 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} do 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.
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 echo
uma maneira conveniente de ver exatamente o que acontece quando uma expansão é disparada. 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.
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 diff
programa 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. A mkdir
-p
opçã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 wget
para 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 *. *
Autor:DAVE MCKAY
Retirado de: https://www.howtogeek.com/725657/how-to-use-brace-expansion-in-linuxs-bash-shell/
Em: 12/05/2021
Nenhum comentário:
Postar um comentário
Observação: somente um membro deste blog pode postar um comentário.