Introdução às expansões dos parâmetros de shell de Bash
- 1833
- 411
- Enrique Crist
Um shell é uma parte crucial de um sistema operacional baseado em UNIX e é a principal interface que podemos usar para interagir com o próprio sistema. Bash é sem dúvida a concha mais usada na maioria das distribuições Linux: nasceu como substituto de software livre para o Bourne Shell
(Bash é o acrônimo para Bourne-de novo) dentro do projeto GNU. Neste tutorial, aprenderemos como algumas das expansões mais úteis do Bash funciona.
Caso você ainda não esteja familiarizado com o BASH, ou simplesmente precisa atualizar sua memória, recomenda -se visitar nosso tutorial de scripts de bash para iniciantes, antes de mergulhar no conceito de expansão do Bash Shell abaixo.
Neste tutorial, você aprenderá:
- Como usar várias expansões de parâmetros de bash
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Independente da distribuição |
Programas | Uma casca de bash |
Outro | Conhecimento básico de Bash |
Convenções | # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular |
A expansão mais simples possível
A sintaxe de expansão dos parâmetros mais simples possível é a seguinte:
$ parâmetro
Quando usamos esta sintaxe, parâmetro
é substituído por seu valor. Vamos ver um exemplo:
$ site = "LinuxConfig.Org "$ echo" $ site "LinuxConfig.org
Nós criamos o site
variável e atribuído o "LinuxConfig.org "
string a ele. Nós então usamos o eco
comando para exibir o resultado da expansão variável. Sendo essa uma expansão básica, teria funcionado mesmo sem o uso de aparelho encaracolado
em torno do nome da variável:
$ echo "$ site" linuxconfig.org
Por que usamos o aparelho encaracolado
então? Aparelhos encaracolados, ao executar expansões de parâmetros, são usados para delimitar o nome da variável:
$ echo "Você está lendo este artigo sobre $ site_!"Você está lendo este artigo sobre
O que aconteceu? Como o nome da variável não foi delimitado, o _
O personagem foi considerado como parte disso. A concha tentou expandir então a existência sites $
variável, portanto, nada foi devolvido. Engajar a variável com aparelho encaracolado resolve este problema:
$ echo "Você está lendo este artigo em $ site _!"Você está lendo este artigo sobre LinuxConfig_!
Embora o uso de aparelhos encaracolados nem sempre seja necessário com expansão básica de parâmetros, é obrigatório realizar todas as outras expansões que veremos neste artigo.
Antes de prosseguir, deixe -me dar uma dica. No exemplo acima, o shell tentou expandir uma variável inexistente, produzindo um resultado em branco. Isso pode ser muito perigoso, especialmente ao trabalhar com nomes de caminhos, portanto, ao escrever scripts, é sempre recomendável usar o substantivo
Opção que faz com que o shell saia com erro sempre que uma variável não existente for referenciada:
$ set -O substantivo $ echo "Você está lendo este artigo sobre $ site_!"Bash: site_: variável não ligada
Trabalhando com indireção
O uso do $ !parâmetro
Sintaxe, adiciona um nível de indireção à nossa expansão de parâmetros. O que isso significa? O parâmetro que o shell tentará expandir não é parâmetro
; Em vez disso, tentará usar o valor de parâmetro
como o nome da variável a ser expandida. Vamos explicar isso com um exemplo. Todos nós sabemos o LAR
A variável se expande no caminho do diretório inicial do usuário no sistema, certo?
$ echo "$ home" /home /egdoc
Muito bem, se agora atribuímos a string "Home", a outra variável e usamos esse tipo de expansão, obtemos:
$ variable_to_inspect = "home" $ echo "$ !variável_to_inspect " /home /egdoc
Como você pode ver no exemplo acima, em vez de obter “casa” como resultado, como teria acontecido se realizássemos uma expansão simples, a concha usou o valor de variable_to_inspect
Como o nome da variável a se expandir, é por isso que falamos sobre um nível de indireção.
Expansão de modificação de casos
Esta sintaxe de expansão de parâmetros, vamos alterar o caso dos caracteres alfabéticos dentro da string resultante da expansão do parâmetro. Diga que temos uma variável chamada nome
; Para capitalizar o texto retornado pela expansão da variável, usaríamos o $ parâmetro^
sintaxe:
$ name = "egidio" $ echo "$ name^" egidio
E se quisermos mausar a sequência inteira, em vez de capitalizá -la? Fácil! nós usamos o $ parâmetro ^^
sintaxe:
$ echo "$ name ^^" egidio
Da mesma forma, para minúsculas o primeiro caractere de uma corda, usamos o $ parâmetro,
Sintaxe de expansão:
$ name = "egidio" $ echo "$ name," egidio
Para baixar a corda inteira, em vez disso, usamos o $ parâmetro ,,
sintaxe:
$ name = "egidio" $ echo "$ name ,," egidio
Em todos os casos, um padrão
Para combinar um único caractere também pode ser fornecido. Quando o padrão é fornecido, a operação é aplicada apenas às partes da string original que a corresponde:
$ name = "egidio" $ echo "$ name ,, [dio]" egidio
No exemplo acima, anexamos os personagens entre colchetes: isso faz com que qualquer um deles seja correspondido como um padrão.
Ao usar as expansões que explicamos neste parágrafo e o parâmetro
é uma matriz subcrated por @
ou *
, A operação é aplicada a todos os elementos contidos nela:
$ my_array = (um dois três) $ echo "$ my_array [@] ^^" um dois três
Quando o índice de um elemento específico na matriz é referenciado, a operação é aplicada apenas a ele:
$ my_array = (um dois três) $ echo "$ my_array [2] ^^" três
Remoção de substring
A próxima sintaxe que examinaremos nos permite remover um padrão
Desde o início ou do final da string resultante da expansão de um parâmetro.
Remova o padrão de correspondência desde o início da string
A próxima sintaxe que examinaremos, $ parâmetro#padrão
, nos permite remover um padrão
de começo do
string resultante do parâmetro
expansão:
$ name = "egidio" $ echo "$ nome#egi" dio
Um resultado semelhante pode ser obtido usando o "$ parâmetro ## padrão"
sintaxe, mas com uma diferença importante: ao contrário da que usamos no exemplo acima, que remove o Padrão de correspondência mais curto Desde o início da string, ele remove o mais longo um. A diferença é claramente visível ao usar o *
personagem no padrão
:
$ name = "egidio dócil" $ echo "$ nome#*i" dio dócil
No exemplo acima, usamos *
como parte do padrão que deve ser removido da sequência resultante pela expansão do nome
variável. Esse curinga
corresponde a qualquer personagem, então o padrão em si traduz em “'i' e tudo diante”. Como já dissemos, quando usamos o $ parâmetro#padrão
Sintaxe, o padrão de correspondência mais curto é removido, neste caso é "egi". Vamos ver o que acontece quando usamos o "$ parâmetro ## padrão"
Sintaxe em vez disso:
$ name = "egidio dócil" $ echo "$ name ##*i" le
Desta vez, o padrão de correspondência mais longo é removido ("Egidio doci"): a correspondência mais longa possível inclui o terceiro 'i' e tudo antes dele. O resultado da expansão é apenas "le".
Remova o padrão de correspondência do final da string
A sintaxe que vimos acima remove o padrão de correspondência mais curto ou mais longo desde o início da corda. Se queremos que o padrão seja removido do fim da string, em vez disso, devemos usar o $ parâmetro%padrão
ou $ parâmetro %% padrão
Expansões, para remover, respectivamente, a partida mais curta e mais longa do final da string:
$ name = "egidio dócil" $ echo "$ name%i*" egidio doc
Neste exemplo, o padrão que fornecemos traduz aproximadamente em “'i' e tudo depois de começar do final da string”. A partida mais curta é "Ile", então o que é devolvido é "Egidio Doc". Se tentarmos o mesmo exemplo, mas usamos a sintaxe que remove a correspondência mais longa que obtemos:
$ name = "egidio dócil" $ echo "$ name %% i*" por exemplo
Nesse caso, a partida mais longa é removida, o que é devolvido é "por exemplo".
Em todas as expansões que vimos acima, se parâmetro
é uma matriz e é subscrito com *
ou @
, A remoção do padrão de correspondência é aplicada a todos os seus elementos:
$ my_array = (um dois três) $ echo "$ my_array [@]#*o" ne três
Pesquise e substitua o padrão
Usamos a sintaxe anterior para remover um padrão de correspondência desde o início ou do final da string resultante da expansão de um parâmetro. E se quisermos substituir padrão
com outra coisa? Podemos usar o $ parâmetro/padrão/string
ou $ parâmetro // padrony/string
sintaxe. O primeiro substitui apenas a primeira ocorrência do padrão, este último todas as ocorrências:
$ phrase = "amarelo é o sol e o amarelo é o limão" $ echo "$ frase/amarelo/vermelho" vermelho é o sol e o amarelo é o limão
O parâmetro
(frase) é expandida e a correspondência mais longa do padrão
(amarelo) é comparado contra isso. A partida é então substituída pelo fornecido corda
(vermelho). Como você pode observar, apenas a primeira ocorrência é substituída, o limão permanece amarelo! Se queremos mudar todas as ocorrências do padrão, devemos prefixá -lo com o /
personagem:
$ phrase = "amarelo é o sol e o amarelo é o limão" $ echo "$ frase // amarelo/vermelho" vermelho é o sol e o vermelho é o limão
Desta vez, todas as ocorrências de "amarelo" foram substituídas por "vermelho". Como você pode ver, o padrão é correspondido onde quer que seja encontrado na sequência resultante da expansão de parâmetro
. Se quisermos especificar que ele deve ser correspondido apenas no início ou no final da string, devemos prefixá -la, respectivamente, com o #
ou %
personagem.
Assim como nos casos anteriores, se parâmetro
é uma matriz subscrita por qualquer *
ou @
, A substituição acontece em cada um de seus elementos:
$ my_array = (um dois três) $ echo "$ my_array [@]/o/u" une twu três
Expansão da substring
O $ parâmetro: deslocamento
e $ parâmetro: deslocamento: comprimento
Expansões Vamos expandir apenas uma parte do parâmetro, retornando uma substring começando no desvio
e comprimento
Personagens de comprimento. Se o comprimento não for especificado, a expansão prosseguirá até o final da string original. Este tipo de expansão é chamado expansão da substring
:
$ name = "egidio dócil" $ echo "$ name: 3" dio dócil
No exemplo acima, fornecemos apenas o desvio
, sem especificar o comprimento
, Portanto, o resultado da expansão foi a substring obtida pela partida no caractere especificado pelo deslocamento (3).
Se especificarmos um comprimento, a substring começará desvio
e será comprimento
Personagens longos:
$ echo "$ Nome: 3: 3" Dio
Se o desvio
é negativo, é calculado a partir do final da string. Nesse caso, um espaço adicional deve ser adicionado após :
caso contrário, o shell o considerará como outro tipo de expansão identificada por :-
que é usado para fornecer um valor padrão se o parâmetro a ser expandido não existir (conversamos sobre isso no artigo sobre como gerenciar a expansão de variáveis vazias ou não definidas):
$ echo "$ name: -6" dócil
Se o fornecido comprimento
é negativo, em vez de ser interpretado como o número total de caracteres que a sequência resultante deve ser longa, é considerada como um deslocamento a ser calculado a partir do final da string. O resultado da expansão será, portanto, uma substring que começa em desvio
e terminando em comprimento
Personagens do final da string original:
$ echo "$ Nome: 7: -3" doc
Ao usar esta expansão e parâmetro
é uma matriz indexada assinada por *
ou @
, o desvio
é relativo aos índices dos elementos da matriz. Por exemplo:
$ my_array = (um dois três) $ echo "$ my_array [@]: 0: 2" Um dois $ echo "$ my_array [@]: -2" dois três
Um negativo comprimento
, Em vez disso, gera um erro de expansão:
$ echo "$ my_array [@]: 0: -2" BASH: -2: expressão de substring < 0
Expansão de "comprimento"
Ao usar o $ #parâmetro
Expansão, o resultado da expansão não é o valor do parâmetro, por seu comprimento:
$ name = "egidio" $ echo "$ #name" 6
Quando parâmetro
é uma matriz e é subscrito com *
ou @
, O número de elementos contidos nele é devolvido:
$ my_array = (um dois três) echo "$ #my_array [@]" 3
Quando um elemento específico da matriz é referenciado, seu comprimento é retornado:
$ echo "$ #my_array [2]" 5
Juntando tudo
Neste artigo, vimos muitas expansões sintaxe. Vimos como minúsculas ou maiúsculas a primeira letra da string resultante da expansão de uma variável, como usar um nível de indireção, como realizar a remoção de substring e expansão da substring, como substituir um padrão por uma string fornecida e como fazer como fazer fazer um parâmetro ser expandido no comprimento de seu valor, em vez de seu próprio valor.
Esta não é uma lista exaustiva de todas as expansões possíveis que podemos executar com o Bash: consulte a documentação da GNU se quiser saber mais. No artigo que também mencionamos Matrizes Bash
: Para saber mais sobre eles, você pode ler nosso artigo dedicado.
Tutoriais do Linux relacionados:
- Coisas para instalar no Ubuntu 20.04
- Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
- Sistema Linux Hung? Como escapar para a linha de comando e…
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
- Ubuntu 20.04 Guia
- Coisas para instalar no Ubuntu 22.04
- Instale Arch Linux na estação de trabalho VMware
- Download do Linux