Teoria Bash

/ bin / bash

0.index

  1. Coisas que acontecem com a maioria das pessoas
  2. Estrutura de um script
  3. Imprimir na tela
  4. Ler o usuário INPUT
  5. Cálculos em bash
  6. Condições
  7. rotações
  8. funções
  9. getops

1. Coisas que acontecem com a maioria das pessoas

/ bin / bash ou / bin / sh

Uma das primeiras coisas que a máquina faz ao executar nosso script é ver com qual shell ela deve fazer isso. Na maioria dos sistemas Linux atuais / Bin / sh é um link para / bin / bash, mas nem sempre é o caso, por exemplo, em distribuições que usam busybox eles trazem Sh e geralmente eles também trazem Bater, mas se você usar / Bin / sh, não funcionará com o Bash. É por isso que recomendo sempre usar / bin / bash.

Unicode vs. ASCII

Você já se perguntou por que não pode usar "¿" ou "ñ" em seus scripts? Ou usar acentos? Pode ser muito chato em scripts interativos. Isso ocorre porque a codificação padrão para Bash é ASCII, ou o que é o mesmo, o conjunto de caracteres em inglês. Para alterá-lo, só precisamos informar ao nosso script que queremos usar Unicode. Para isso, você deve adicionar uma linha logo após o interpretador de comandos:

# - * - CODIFICAÇÃO: UTF-8 - * -

Cuidado, é importante que esta linha esteja no início do script.

Torne o script executável

É engraçado quantas pessoas executam os scripts com «$ bashscript.sh" em vez de "$./script.shAfinal, é para isso que definimos uma concha.

Para adicionar permissões de execução, você deve executar:

sudo + x script.sh
Se nosso script for executável, podemos adicioná-lo ao nosso PATH e torná-lo executável de qualquer / pasta em nosso computador. Para isso, devemos adicionar ao .bashrc do nosso usuário ou ao / etc / bashrc a linha
BIN = "pasta onde temos os scripts" PATH = "$ BIN $ PATH"
É uma regra Bash escrever nomes de variáveis ​​em letras maiúsculas. Muitas pessoas não seguem esta regra, mas para scripts longos ela é apreciada porque os torna muito mais legíveis

2. Estrutura de um script

  1. Cabeça
  2. Definição de variáveis ​​globais
  3. ajudar
  4. funções
  5. Corpo Principal

O cabeçalho é onde indicamos qual shell queremos usar e a codificação. A vantagem das funções é reutilizar o código que se repete escrevendo-o apenas uma vez e para facilitar a compreensão do script, pois um código que ultrapassa 100 linhas é muito útil.

Para usar funções, elas devem ser definidas com antes do corpo principal de nosso script. E se quisermos usar variáveis ​​no nível global de todo o nosso script, tanto no corpo principal quanto nas funções, devemos defini-las no início de tudo, logo após o cabeçalho.

Finalmente, é uma boa prática escrever uma função auxiliar para quando nosso script for executado incorretamente ou com parâmetros inválidos. Obviamente, nesses casos queremos sair do script imediatamente, sem ler as funções. Para isso podemos usar:

function help () {echo "" "Nosso texto de ajuda bem formatado." "" sair se [[-z $ 1 || $ 1 == "-h" || $ 1 == "--help"]]; então ajude fi

Se adicionarmos "exit" à função de ajuda, sairemos do script toda vez que executarmos a ajuda, por exemplo, após mensagens de erro, etc. Salvamos algumas linhas de código.

A condição indica exibir ajuda na tela e sair se o script for executado sem parâmetros ou se -h / –help for especificado. Se você observar, esse é o comportamento padrão da maioria dos programas Linux.

O uso das 3 aspas com echo permite usar quebras de linha sem deixar que a mensagem seja exibida por echo. Para mensagens com várias linhas, é muito mais conveniente usar o eco apenas uma vez.

3. Imprimir na tela

Existem 2 comandos principais para imprimir na tela em bash: «eco"E"printf«. Ambos são rápidos e fazem parte do bash. A principal diferença para um iniciante é que o echo adiciona uma nova linha no final, enquanto «printf" não o faça.

Echo é muito bom e é o que a maioria das pessoas usa, porém ao ler o INPUT do usuário, ou quando quiser imprimir variáveis ​​retiradas de arquivos por processador de texto, coisas estranhas podem acontecer. Eles geralmente são resolvidos facilmente, tão fácil quanto mudar as aspas duplas para simples ou vice-versa, ou tirar as referências de variáveis ​​das aspas. «Echo»Faz coisas estranhas também dependendo de como foi compilado, se sempre usarmos Ubuntu ou sempre Fedora, isso não nos afeta, mas se mudarmos a distribuição afeta.

É por isso que eu uso «printf«, O que não me dá dores de cabeça e também se comporta mais como«printf»De C ou do«impressão»Do Python, isso é muito importante se você quiser portar seu script para outra linguagem de programação.

Para uma discussão mais ampla, você pode visitar esta pergunta do Unix e Linux no Stack Exchange.

4. Leia o usuário INPUT

Tudo o que escrevemos após o nome do nosso script e antes de pressionar a tecla ENTER é salvo automaticamente em variáveis ​​especiais. Essas variáveis ​​são do tipo $ X, em que X é um número.

«$0»Indica o nome do nosso script e de«$1»Ao infinito, tudo o que escrevemos depois é variável. Por exemplo:

cat << EOF >> test.sh #! / bin / bash # - * - CODIFICAÇÃO: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n" EOF chmod + x script.sh ./script.sh meu arquivo.txt

Criamos um script de teste, o tornamos executável e o executamos com 2 parâmetros. Obtemos a saída da tela de:

$ 0 = ./script.sh $ 1 = meu $ 2 = arquivo.txt

Usando aspas, poderíamos ter passado "meu arquivo.txt" para "$ 1".

Também podemos ler o INPUT de um usuário com o comando "ler", indicando diretamente a variável onde queremos salvar o parâmetro. Por exemplo:

printf "Qual é o seu nome? \ n" leia NOME printf "Olá, $ NAME. \ n"
Tenha cuidado com a atribuição de variáveis. "$ VAR = content" produzirá um erro, não podem ser deixados espaços entre o sinal de igual, o nome da variável e o conteúdo. O uso correto é "VAR = conteúdo"

5. Cálculos em Bash

Para isso podemos usar «expr«, Desde que não necessitemos de cálculos complexos. Duas coisas devem ser observadas, a primeira é que «expr»Admite apenas números inteiros, a segunda é que a divisão devolve o resultado inteiro, para ver o resto podemos usar«%".

Normalmente, queremos atribuir o resultado de expr a uma variável. Podemos fazer isso de duas maneiras:

VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)

Você também pode pular «expr»Usando parênteses duplos:

VAR2 = $ (($ VAR1 / 100))
Para uma explicação mais detalhada de «expr»Ou uma alternativa que usa números inteiros, você pode olhar para esta entrada KZKG ^ gaara.

6 Condições

Já foi escrito longamente sobre «if«,«outro«,«elif»E condições. Você pode ler sobre isso em:

Só quero destacar a diferença entre o uso de colchetes simples, «[]«, E colchetes duplos,«[[]]«, Para as condições. Com colchetes duplos, podemos usar condições adicionais:

  • «&&"Para e
  • «||»Para ou

Usar "&&"E"||»Com colchetes simples, cada parte deve ser separada entre colchetes separados. O exemplo usado para a parte do script que verifica se a ajuda precisa ser executada seria:

if [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; então ajude fi

Também evita que tenhamos de escrever nomes de variáveis ​​entre aspas para evitar erros. Por exemplo:

se [$ 1 = 1]; então printf "O parâmetro é igual a 1."; fi se ["$ 1" = 1]; então printf "O parâmetro é igual a 1."; fi se [[$ 1 = 1]]; então printf "O parâmetro é igual a 1."; fi

Se script.sh fosse executado sem nenhum parâmetro, o primeiro caso geraria um erro:

bash: [: =: operador unário esperado
No Bash, "=" e "==" são interpretados da mesma maneira. Isso não acontece em outras linguagens de programação onde "=" é usado apenas para atribuir variáveis.

O que não foi falado é «casas«, Usado para simplificar«if«. Vamos começar do início, quando não temos nenhum «if»Todo código será executado. Se adicionarmos uma condição «if»Teremos dois casos, um em que o bloco de código dentro do«if»E o outro caso em que este bloco não é executado.

Se adicionarmos um «outro«Teremos também dois casos, mas estes dois casos são diferentes dos anteriores. Porque agora haverá dois blocos de código condicionais, A e B, e um bloco C, que é o resto do programa. A ou B será executado, e C. No caso anterior era A e C ou apenas C.

Para evitar condições de escrita «se / mais" Dentro de "outro»E para simplificar a leitura do código, foi criado«elif«. Quando temos muitas condições que dependem da anterior, por exemplo, intervalo de números ou tipo:

VAR1 = $ 1 se [[$ VAR1 = 1]]; então printf "1 \ n" elif [[$ VAR1 = 2]]; então printf "2 \ n" elif [[$ VAR1 = 3]]; então printf "3 \ n" else printf "nenhum \ n" fi

No caso do último «elif»Muitas condições serão lidas. Com o caso, este processo é simplificado:

VAR1 = $ 1 caso $ VAR em 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 ou 4, depende \ n" ;; *) printf "nenhum \ n" ;; aquele C

Será lida uma variável, neste caso VAR1, e será verificado se é equivalente a algum dos casos, caso contrário, será executado o caso padrão "*". Os pontos e vírgulas duplos são equivalentes a «quebrar", Eles dizem"casas»Isso tem que acabar.

«Estudos de »Também pode ser usado como uma sequência de«if«, Para isso, você deve usar« ;; & »(continuar) em vez de« ;; » (Pare).

7. Loops

Muito poucos loops são conhecidos em qualquer linguagem de programação. Em Bash eles são «enquanto«,«até"E"para«. Já foi escrito no blog sobre estes:

Existem dois tipos de loops «para«, Aqueles que são do tipo«$ para VAR em LOQUESEA»E quais são do tipo C«$ para ((I = 0; I <= 10; I ++))«. O segundo tipo de loops «para»São muito úteis, pois possuem 3 partes no início do loop:

  • Declaração e iniciação de variáveis ​​(neste caso uma variável auxiliar "I = 0").
  • Condição de execução (até que I seja menor ou igual a 10).
  • Aumento da variável auxiliar

Na minha opinião, é o loop mais poderoso de todos. Um exemplo, que imprime todos os números de 0 a 10, inclusive:

#! / bin / bash para ((I = 0; I <= 10; I ++)); faça printf "$ I \ n" feito

8. Funções

Existem algumas coisas que o Bash não nos permite fazer, certo? À primeira vista, as funções bash evitam que você faça 3 coisas: declarar variáveis ​​locais em funções, passar parâmetros para funções e retornar parâmetros. Tudo tem solução.

Não faça nada como:

#! / bin / bash VAR = 1 printc "$ VAR \ n" função hello () {VAR = 2 printf "$ VAR \ n"} hello printf "$ VAR \ n"

Isso imprime nas telas 1, 2 e 2.

Para declarar variáveis ​​locais, adicione «local»Ao declarar:

#! / bin / bash VAR = 1 printf "$ VAR1 \ n" função foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"

Isso imprime 1, 1, 2, 1 na tela.

Como você passa parâmetros para uma função?

#! / bin / bash # - * - CODIFICAÇÃO: UTF-8 - * - função hello () {printf "Olá $ 1 \ n"}

printf "Qual é o seu nome? \ n"
ler VAR1
olá $ VAR1

Como os parâmetros são retornados?

#! / bin / bash # - * - CODIFICAÇÃO: UTF-8 - * - function hello () {printf "Hello holita"} printf "Qual é o seu nome? \ n" leia VAR1 VAR1 = $ (hello) # AQUI ESTÁ printf "$ VAR1 $ VAR2 \ n"

Como você pode ver, isso tem duas desvantagens, você só pode retornar um parâmetro, que pode ser um vetor 😀, e se quiser retornar um parâmetro, você não pode mais imprimir na tela a partir dessa função.

Você pode encontrar mais coisas sobre funções em [url=https://blog.desdelinux.net/programando-en-bash-parte-3/]este artigo da Usemoslinux[/url].

9. Getops

Uma das últimas coisas que você precisa saber sobre o Bash para criar scripts complexos é «getops«. É usado para passar opções ao script, independentemente da ordem. A única desvantagem é que afeta apenas as opções curtas:

#! / bin / bash # - * - CODIFICAÇÃO: UTF-8 - * - VARC = 0 função help () {printf "Mensagem de ajuda \ n" sair} if [[-z $ 1]]; então ajude fi enquanto getopts: ha: b: c OPT; faça o case $ OPT em h) help ;; :) Socorro ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) Socorro ;; esac done # Bloco principal do script que # faz coisas com VARA, VARB e VARC

«getopts»Lê as opções uma por uma, então um loop é necessário.

Existem 2 tipos de opções que podem ser passadas usando «obter opções":

  • Parâmetros chamados sinalizadores, neste caso -c ou -h. Eles são especificados com a letra que queremos usar. Eles são como variáveis ​​booleanas, «verdadeiro»(São) ou«falso" (não estão).
  • Parâmetros com argumentos associados, -a qualquer coisa, -b qualquer coisa. Eles são especificados com a letra desejada com dois pontos abaixo. O argumento é armazenado em OPTARG (este nome é imutável).
Os pontos duplos iniciais são para não mostrar erros.

O que este script faz?

Mostra a mensagem de ajuda quando nenhuma opção é passada, quando o parâmetro "-h" é passado, quando um parâmetro inválido é passado (por exemplo "-x", isso é feito por "\?") Ou quando um parâmetro válido sem argumento (":"). No resto dos casos, ele salva a presença de "-c" como 1 em VARC e os valores passados ​​com "-a" e "-b" em VARA e VARB.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   elav. dito

    MAGISTRAL. Eu não digo mais U_U

  2.   Miguel dito

    Olá artigo muito bom.
    Ei, você colocou para dar permissões sudo + x em vez de chmod + x

    1.    Henry dito

      $ sudo chmod + x script.sh
      (Para ser mais exato, hehe)

      Ah, parabéns e obrigada!

  3.   fogo de fogo dito

    Postagem muito boa, estou de parabéns, continue assim, Saudações

  4.   Gustavo dito

    E se você quiser que o script fique visível quando for executado, passo a passo, vendo por exemplo como variáveis, condições e tudo se comportam, você pode usar:

    script sh -x

    lembranças

  5.   gringo dito

    PEÇA de tutela. Excelente e muito bem explicado.
    Obrigado.

  6.   Gabriel dito

    Excelente postagem sobre o assunto 😉

  7.   Mário Guilhermo Zavala Silva dito

    Muito interessante e importante, obrigado pela informação….
    FELICIDADES !!!

  8.   Não do Brooklyn dito

    Obrigado a todos pelos parabéns, pois ao comando Miguel não me deixa alterar o verbete depois de publicado. Terá que fazer elav eu imagino.

  9.   Adrian dito

    Muito bom!

    Antes de mais nada queria parabenizá-los pelo post, achei fácil de entender e realmente ajuda seguir as orientações para programar bem no bash, principalmente para quem está começando a programar.

    No entanto, encontrei alguns detalhes que acho que devem ser corrigidos.

    Primeiro: na seção «2. ESTRUTURA DE UM SCRIPT »a função não está fechada, o que causará problemas ao executá-la em um script.
    A solução seria adicionar uma chave logo após o comando "sair".

    Segundo: na seção «4. LEIA A ENTRADA DO USUÁRIO ”você afirma que os parâmetros que o usuário pode inserir vão de $ 0 ao infinito, porém,“ bash ”só interpretará de $ 0 a $ 9, já que $ 10 seria igual a $ 1 + 0.
    Para resolver esse problema, você pode usar o comando "shift" para obter as seguintes variáveis. Ou especifique a variável entre colchetes "$ {10}", de modo que bash leve os valores juntos, não como $ 1 + 0.

    Sem mais delongas, saudações!

    1.    Não do Brooklyn dito

      Obrigado pelo seu comentário. Falhou totalmente em explicar o uso correto de exit, tanto no script quanto nas funções. Quanto a $ {10} nunca deixei tanto, por isso não me deparei com esse problema, é bom saber que existe uma solução para isso (já risquei o que aprendi hoje 😀).

  10.   Chanio dito

    Muito obrigado pelo artigo! Algumas das coisas que você mencionou eu precisava esclarecer. Por exemplo, getops.
    Na parte das saídas da tela, você não mencionou o gato que depois mencionou ...
    gato <
    ***************************************
    * ESTE FORMULÁRIO É MUITO EXPRESSIVO *
    ***************************************
    EOF

    No seu exemplo:
    cat << EOF >> test.sh
    Duas coisas devem ser mencionadas ... >> é 'anexar' ou seja, se você repetir o mesmo comando, terá o script inteiro em duplicata ... Você deve usar apenas um ...
    cat << EOF> script.sh
    Sim, também deve ser chamado de script.sh
    Então em
    if [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; então
    ajudar
    fi

    Acho que deveria ser escrito ...
    if [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–help"]]; então
    ...

    Há muito mais para descobrir no BASH.
    Você poderia chamá-lo de "BÁSICO"? 🙂
    Por exemplo, o parâmetro 'testers' como -z para ver se eles estão vazios ou -f para saber se existe como um arquivo.

    Mais uma vez, obrigado por seu esforço.
    alberto

  11.   clow_eriol dito

    Um tutorial de script bash muito bom!

  12.   ocz dito

    -- CODIFICAÇÃO: UTF-8 --

    É a primeira vez que vejo essa linha para definir a codificação de caracteres em um script bash. Parece-me mais Python do que Bash. É realmente necessário? Procurei uma referência no Google mas não encontrei nada, você tem algum link disponível que fale sobre esse assunto? Especificamente sobre a adequação dessa linha.

    Na minha opinião, para escrever scripts em Bash usando UTF-8, você só precisa salvar o arquivo de texto como tal (sem BOM) e ter certas variáveis ​​de ambiente, (LANG e LC_ *), definidas corretamente.
    Então, obviamente, é necessário que os comandos executados sejam preparados para codificações diferentes de ASCII. Por exemplo, se quisermos converter para maiúsculas, isso não parece funcionar:
    «Echo áéíóú | tr az AZ »
    o:
    «Echo áéíóú | tr [: inferior:] [: superior:] »
    e é melhor usar:
    «Echo áéíóú | awk '{print toupper ($ 0)}' ».

    1.    Não do Brooklyn dito

      Sobre a "codificação»Já foi mencionado neste blog antes:

      Bash: como tornar um script executável
      Script de utilitário de pós-instalação

    2.    borriquito como você dito

      Alguém me corrige, mas aquela linha de codificação (# -- CODIFICAÇÃO: UTF-8 --) Não tem nada a ver com o bash ou o shell: é uma linha de comentário (começa com #) e serve para informar ao EDITOR que usamos para escrever o script (vim, emacs ...) a codificação do arquivo.

      Na verdade, o bash não vê essa linha, porque é uma linha de comentário.

  13.   JoRgE-1987 See More dito

    Excelente tutorial, pois Sysadmin saber Scripting em Bash é essencial, é útil para tudo.

    Muito muito bom!

    Saudações!

  14.   Eduardo cuomo dito

    Caso seja útil para qualquer pessoa, aqui estão vários usos e exemplos para criar seus próprios Scripts: https://github.com/reduardo7/hsabx

  15.   Lito Black dito

    Muito bom. Novas coisas para adicionar aos meus scripts. A coisa da codificação e a coisa do printf não tinham.
    Obrigado!!!

  16.   xxxtonixxx dito

    Artigo tão bom! Eu mantenho este aqui como favoritos, seria legal corrigir o que está errado e até mesmo expandir com mais conteúdo. Uma salva de palmas por todas essas informações !!!!