
A expansão de chaves é uma técnica útil para gerar listas de strings que podem ser usadas em scripts e apelidos e na linha de comando do Linux.. Economize tempo e evite erros digitando menos.
Expansão da braçadeira
Antes da concha de Bash execute um comando em uma janela de terminal ou uma linha em um script, verifique se você precisa fazer alguma substituição no comando. Nomes de variáveis são substituídos por seus valores, aliases são substituídos pelos comandos para os quais são abreviados e qualquer expansão é realizada. A expansão principal é uma forma de expansão suportada pelo Bash.
A expansão da braçadeira é habilitada em caixas modernas, mas é possível que esteja faltando em alguns casos antigos. Se você for usar expansão de chaves em seus scripts, certifique-se de invocar um shell que suporte expansão de chave, como Bash:
Usaremos Bash para nossos exemplos.
A geração de listas de strings pode parecer mais uma novidade do que um benefício, mas oferece alguns recursos que podem economizar tempo e digitação. Frequentemente, pode fornecer uma solução simples e elegante para um obstáculo ou requisito.
Expansões simples
Uma expansão chave está contida entre um par de chaves “{}”. Pode ser uma lista de itens separados por vírgulas ou um especificador de intervalo. Não são permitidos espaços dentro das teclas, a menos que você tenha embrulhado a corrente entre aspas “"
. “
Para uma lista separada por vírgulas, o procedimento de expansão pega cada elemento por vez e passa para o comando de chamada. Neste exemplo, isto é echo
que apenas os imprime na janela do terminal. Observe que as vírgulas são ignoradas.
eco {1,dois,três,quatro}
Uma lista pode ser composta por palavras ou dígitos.
eco {1,2,3,4}
A ordem dos itens na lista é absolutamente arbitrária.
eco (4,2,3,1)
uma faixa de expansão tem um caractere de início e fim conectado com cólons ” ..
”Sem nenhum espaço em branco. A expansão fornece automaticamente todos os itens da lista que faltam, então todo o intervalo é criado do caractere inicial ao final.
Isso imprimirá os dígitos do 1 al 10.
eco {1..10}
A numeração é arbitrária. Você não tem que começar em um.
eco {3..12}
Os intervalos podem ser especificados para executar para trás. Isso irá gerar uma lista de cinco para um.
eco {5..1}
Os intervalos podem incluir números negativos.
eco {4..-4}
Como apontamos anteriormente, um intervalo tem um começo e um fim personagem. Não precisa ser um número. Pode ser uma carta.
eco {q..v}
As letras também podem ir para trás.
eco {f.. Para}
Usando expansão de espartilho em loop
Você pode usar a expansão da chave com faixas em loop em scripts.
para i em {3..7}
do
echo $i
done
faixas de expansão chave permitem que você use caracteres como uma variável de loop.
para i em {m..q}
do
echo $i
done
Loops são geralmente usados em scripts, mas não há nada para impedi-lo de digitá-los na linha de comando para ver o que acontece.
para i em {3..7}; faça eco $ i; feito
para i em {m..q}; faça eco $ i; feito
Concatenação e aninhamento
Duas expansões adjacentes não agem independentemente uma após a outra. Interoperação. Cada elemento na primeira expansão é acionado por cada elemento na segunda expansão..
eco {q..v}{1..3}
As expansões também podem ser aninhadas. Uma expansão aninhada atuará no elemento imediatamente anterior.
eco {parte-1, parte-2{uma,b,c,d},parte 3}
Além disso, você pode aninhar expansões criando uma lista delimitada por vírgulas de expansões de intervalo.
eco {{5..0},{1..5}}
Preâmbulo e pós-escrito
Você pode colocar o texto antes e depois de uma expansão entre chaves para que o 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:
eco {conteúdo,papel,bilbiografia}.md
E este comando usa ambos.
capítulo de eco-{1..4}.md
Extensão de diretório e nomes de arquivo
Como você provavelmente já adivinhou, 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
como uma maneira conveniente de ver exatamente o que acontece quando uma expansão é acionada. Você pode substituir qualquer comando que tenha nomes de arquivos ou diretórios como entrada e usar a expansão de chaves com ele.
Para criar rapidamente alguns arquivos, usar touch
:
toque no arquivo{1..4}.TXT
ls * .txt
Se você tiver muitos arquivos com o mesmo nome de base, mas extensões de arquivo diferentes e quiser realizar uma operação em um subconjunto deles, as principais expansões podem contribuir. Aqui, estamos comprimindo um subconjunto de arquivos que eles têm “Programa” como um nome base em um arquivo ZIP chamado “código fonte.zip”.
diretórios de desenvolvimento contêm muitos arquivos que terão o mesmo nome base de seu programa principal. Em geral, você não quer fazer backup ou distribuir arquivos como arquivos de objeto “.o”. Esta é uma maneira simples de incluir apenas os tipos de arquivo de interesse.
programa de código-fonte zip{.c,.h,.css}
este comando vai fazer uma cópia de um arquivo e adicioná-lo “.Bak”, fazendo backup do arquivo original. Um ponto interessante a ser observado é que a expansão da chave contém uma lista separada por círios., mas o primeiro item está vazio. Se não tivéssemos incluído a vírgula, expansão não teria ocorrido.
cp brace/new/prog-1.c{,.Bak}
ls brace/new/prog-1.c.bak
Para executar qualquer ação em dois arquivos em diretórios diferentes, podemos usar uma expansão chave no caminho para os arquivos.
Neste exemplo, o diretório “Chave” contém dois subdiretórios, um chamado “novo” e outra ligação “antigo”. Eles contêm versões diferentes do mesmo conjunto de arquivos de código-fonte. Nós vamos usar o diff
programa para ver as diferenças entre as duas versões de “prog-1.c.”
chave diferencial /{novo,velho}/prog-1.c
Se você tiver um esqueleto de diretório padrão que precisa criar no início de um projeto, você pode criá-los rapidamente usando a expansão de chave. a mkdir
-p
opção (Papai) criar diretórios pais ausentes ao criar um diretório filho.
mkdir -p {fonte,construir,cara,ajuda{/Páginas,/uivo,/imagens}}
árvore
Você pode usar a expansão do espartilho com wget
para baixar vários arquivos.
Neste comando, vamos baixar arquivos de dois diretórios, chamado “teste1” e “teste2”. Cada diretório contém dois arquivos chamados “imagem1” e “imagem2”.
wget https://www.URL-of-your-choice.com/test{1,2}/foto{001,002}.jpg
Listar os arquivos mostra os arquivos que foram recuperados e como wget
renomeie arquivos para evitar conflitos de nome com arquivos existentes.
ls imagem *. *
Prenda a braçadeira
Parece que a expansão de chave é outro dos segredos mais bem guardados do Linux. Muitas pessoas me dizem que nunca ouviram falar de expansão de chave, enquanto outros me informam que é um de seus truques de linha de comando favoritos.
Experimente e você poderá encontrar seu caminho em torno de seu conjunto de truques de linha de comando.