Variáveis ​​de bash especiais com exemplos

Variáveis ​​de bash especiais com exemplos

Bash é uma ótima linguagem de codificação, que permite fazer coisas complexas como manipulação de big data ou simplesmente criar scripts de gerenciamento de sever ou desktop.

A habilidade de nível de entrada necessária para usar a linguagem bash é bastante baixa e scripts de uma linha (um jargão frequentemente usado, que indica vários comandos executados na linha de comando, formando um mini-script), bem como scripts regulares, podem crescer em complexidade (e quão bem escritos eles estão) à medida que o desenvolvedor da Bash aprende mais.

Aprender a usar variáveis ​​especiais em Bash é uma parte dessa curva de aprendizado. Enquanto que originalmente as variáveis ​​especiais podem parecer enigmáticas: $$, $?, $*, \ $ 0, $ 1, etc., Depois de entendê -los e usá -los em seus próprios scripts, as coisas logo se tornarão mais claras e mais fáceis de lembrar.

Neste tutorial, você aprenderá:

  • Como usar variáveis ​​especiais em Bash
  • Como citar corretamente variáveis, mesmo as especiais
  • Exemplos usando variáveis ​​especiais da linha de comando e scripts

Variáveis ​​de bash especiais com exemplos

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 Linux
Programas Linha de comando Bash, sistema baseado em Linux
Outro Qualquer utilidade que não esteja incluída no shell bash por padrão pode ser instalada usando sudo apt-get install utility-name (ou yum install para sistemas baseados em redhat)
Convenções # - requer que o Linux -Commands seja executado com privilégios de raiz diretamente como usuário root ou por uso de sudo comando
$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular
  1. $$ - exibir o PID (identificador de processo)

    Neste exemplo, usamos a variável especial $$ Para exibir o PID (identificador de processo) Para o nosso programa atual. Isso funciona de maneira um pouco diferente, dependendo de você usar essa variável da linha de comando:

    $ echo $$ 316204 $ ps -ef | Grep -e "$$ | pid" UID PID PPID C STIME TTY TEMPO CMD ROEL 316204 62582 0 11:53 PTS/2 00:00:00 BASH ROEL 316499 316204 0 11:57 pts/2 00:00:00 PS - EF Roel 316500 316204 0 11:57 pts/2 00:00:00 Grep -e 316204 | PID 

    Ou de dentro de um script. Por exemplo, vamos considerar o seguinte script teste.sh:

    eco $$ ps -ef | grep -e "$$ | pid" 
    cópia de

    Que, quando o tornamos executável (teste CHMOD +X.sh) e executar, produz:

    $ chmod +x teste.sh $ ./teste.SH 316820 UID PID PPID C TEMPO TEMPO CMD ROEL 316820 316204 0 12:01 PTS/2 00:00:00 BASH ROEL 316821 316820 0 12:01 PTS/2 00:00:00 PS -EF Roel 316822 316820 0 12: 01 PTS/2 00:00:00 GREP -E 316820 | PID 

    A diferença está no PID produzido! Isso pode à primeira vista fazer sentido conceitual, mas vamos explicar a principal razão pela qual PID Difere: estamos usando uma casca de bash diferente. O primeiro comando executado foi diretamente na linha de comando e, portanto, nosso especial $$ variável (que identifica o PID do programa atualmente em execução) produz o PID do shell de bash atualmente em execução (sendo 316204).

    Na segunda instância, estamos executando um script e cada início de um script sempre iniciará um novo shell de festa. O resultado é que nosso PID é o PID do recém -iniciado Bash Shell (316820). Também podemos confirmar isso olhando para o PPID (eu.e. PID pai, ou o pai do identificador do processo) - isso é 316204 que corresponde à nossa concha de bash, a partir da qual iniciamos o script, como visto no primeiro exemplo (o primeiro e o segundo exemplo foram executados no mesmo terminal na mesma máquina).

    O grep -e O comando em nossos dois exemplos nos permite capturar a primeira linha da lista de processos completos da máquina (conforme obtido por ps -ef) permitindo suporte de regex estendido e Grepping para PID além do nosso PID (usando $$). O | é o separador de expressão regular estendido que permite esta captura dupla.

    Para obter mais informações sobre expressões regulares, consulte nossos regexps Bash para iniciantes com exemplos e Bash Regex avançado com exemplos de artigos.

    Observe também que automatizamos a captura do PID usando $$ no grep comando. Esse $$ A variável nunca muda, a menos que um novo shell / subshell bash seja iniciado, como podemos ver no exemplo a seguir:

    $ echo $$ 316204 $ BASH $ ECHO $$ 318023 $ ECHO $ ​​PPID 316204 

    O PID da nossa casca principal principal ainda é 316204 como antes. Em seguida, começamos uma nova subshell e o PID desta nova concha é 318023 quando inspecionado. E, usando a variável automaticamente definida (por bash) $ Ppid Podemos confirmar o PPID (ID do processo pai) do shell/sub -Shell secundário 316204, que corresponde à nossa concha principal. Como você pode ver, em termos de gerenciamento de processos e especificamente o $$ Variável, não há muita diferença entre iniciar um script e uma nova subshell.

    Para obter mais informações sobre o gerenciamento de processos da BASH, você pode fazer o check -out de nosso gerenciamento de processos e gerenciamento de listas de processos e artigos automáticos de terminação de processos.



  2. $? - Código de saída

    O $? A variável nos diz o que o Código de saída era do comando anterior. Conhecendo o Código de saída de uma declaração executada nos permite continuar um script em duas ou mais direções diferentes. Por exemplo, se começarmos um rm comando (para excluir alguns arquivos) de dentro de um programa, podemos querer verificar se o processo concluiu com êxito.

    Se o Código de saída é 0, Geralmente (leia: quase sempre) significa que um processo terminou com sucesso. Se, no entanto Código de saída é 1 (ou mais) isso frequentemente (embora nem sempre) significa que o processo terminou com um erro ou resultado negativo, por exemplo, o arquivo não pôde ser excluído em nosso exemplo. Vamos ver como isso funciona na linha de comando, lembrando que o funcionamento dessa variável de dentro de um script é idêntico.

    $ toque isso.existe $ rm isso.existe $ eco $? 0 $ rm isso.faz.não.existe rm: não posso remover 'isso.faz.não.existir ': nenhum arquivo ou diretório $ echo $? 1 

    Primeiro criamos um arquivo esse.existe usando o tocar comando. tocar simplesmente cria um arquivo de tamanho zero sem escrever nada para ele. Em seguida, removemos o arquivo usando rm isso.existe e exibir o $? Código de saída usando eco. O resultado é 0 como o comando foi bem -sucedido como previsto e visto por nenhum erro sendo retornado.

    Em seguida, tentamos excluir um arquivo que não existe e recebemos um erro. Quando verificamos o código de saída, é de fato 1 indicando algum erro ocorreu. Podemos verificar o valor dessa variável facilmente a partir da linha de comando ou de um script usando um se [$? -eq 0]; então ou declaração condicional semelhante (encerrada por fi).

    Para aprender mais sobre se declarações baseadas, consulte Bash se declarações se elif mais então fi. Combinando $? com se Declarações é comum e poderoso para automatizar várias coisas em Bash.

  3. $ 1, $ 2,… $* - argumentos passantes

    Quando iniciamos um script na linha de comando Bash, podemos passar argumentos para o mesmo. Está totalmente à altura do script para lidar com os argumentos passados ​​para ele. Se o script, por exemplo, não lidar com argumentos (o padrão), não há conseqüências para especificar ou não especificar nenhuma ou muitas variáveis ​​para um script.

    Podemos lidar com argumentos passados ​​usando as variáveis ​​especiais $ 1, $ 2, $* etc. O primeiro argumento passou para o script sempre será $ 1, O segundo argumento sempre será $ 2 etc. Uma coisa a ser observada é que, se você apresentar um espaço em um cliente Bash configurado padrão, o Bash interpretará esse espaço como um separador.

    Se você está tentando passar algum texto como por exemplo isto é um exemplo Você precisaria citá -lo corretamente assim: "isto é um exemplo"; para que Bash veja esse texto como uma única variável sendo passada.



    O especial $* A variável é uma abreviação para escrever Todas as variáveis em uma única corda. Vamos ver como isso funciona definindo um novo Test2.sh script da seguinte forma:

    eco "1: $ 1" echo "2: $ 2" echo "all: $ *" 
    cópia de

    Como uma pequena variação, optamos por definir nossas variáveis ​​aqui como $ 1 para $ * em vez de $ 1 para $*. De fato, seria uma boa ideia sempre citar variáveis ​​dessa maneira. Para mais informações, dê uma olhada na nossa variável correta análise e citação no artigo do Bash.

    Quando executamos o mesmo, usando dois ou três argumentos, vemos:

    $ chmod +x test2.sh $ ./test2.Sh '1 "2' 1: 1 2: 2 todos: 1 2 $ ./test2.Sh '1 "2" 3' 1: 1 2: 2 All: 1 2 3 

    Podemos ver como nossa primeira entrada para o script está sendo reconhecida corretamente como $ 1 etc. Além disso, notamos que o terceiro argumento é completamente ignorado pelo script até atingir o eco "all: $ *" Instrução que realmente mostra todos os argumentos, conforme discutido anteriormente. Vamos agora explorar uma entrada incorreta sem citar:

    $ ./test2.sh, isso deve ser uma única frase. 1: Este 2: é tudo: isso deve ser uma única frase. $ ./test2.sh "Isso deve ser uma única frase."1: isso deve ser uma única frase. 2: Todos: isso deve ser uma única frase. 

    Aqui fica claro como um espaço pode ser interpretado como um separador em vez de um espaço real, a menos que o texto seja citado corretamente. No primeiro resultado, Esse é visto como o primeiro argumento, enquanto no segundo resultado, toda a frase é vista como o primeiro argumento.



  4. $ 0 - o comando em execução

    Tendo aprendido sobre $ 1, Pode -se se perguntar o que o \ $ 0 A variável especial faz. Se você pensar em como um comando é formado (Comando argumento1 argumento2 etc.), você pode notar como comando vem antes do primeiro argumento ($ 1). O comando, de certa forma, é assim - visualmente - \ $ 0, E é exatamente isso que o especial \ $ 0 variável contém; o comando em execução.

    $ echo \ $ 0 bash 

    Como podemos ver, e como faz sentido, na linha de comando, o comando atualmente em execução é Bash. Se adicionarmos o eco \ $ 0 comando para um script de teste Test3.sh e executar o mesmo, obtemos:

    $ ./test3.sh ./test3.sh $… /workspace /test3.sh… /workpace /test3.sh 

    Como agora o comando atualmente em execução é ./test3.sh, Exatamente como executado da linha de comando. Se iniciarmos o comando usando um nome de caminho mais longo como … /Workspace /test3.sh então, novamente, isso é repetido de volta através do especial \ $ 0 variável.

Conclusão

Neste artigo, exploramos o $$, $?, $ 1, $ 2, etc., $* e \ $ 0 Variáveis, como elas funcionam e como você pode usá -las diretamente da linha de comando ou dentro dos scripts. Existem algumas outras variáveis ​​especiais, mas essas são as principais variáveis ​​especiais no Bash que eu usei ao longo de muitos anos de codificação de bash. Aproveitar!

Tutoriais do Linux relacionados:

  • Recuperando as páginas da web usando WGE, CURL e Lynx
  • Manipulação de big data para diversão e lucro Parte 1
  • Manipulação de big data para diversão e lucro Parte 3
  • Exemplos de uma linha do Linux Complex Bash
  • Manipulação de big data para diversão e lucro Parte 2
  • Loops aninhados em scripts de basquete
  • Mastering Bash Script Loops
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Bash Loops com exemplos