Introdução às expansões dos parâmetros de shell de Bash

Introdução às expansões dos parâmetros de shell de Bash

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

Requisitos de software e convenções de linha de comando Linux
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