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.
Índice
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.
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.
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 é 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.
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 *. *
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.