Pular para o conteúdo
Início » Compreendendo os Scripts de Shell

Compreendendo os Scripts de Shell

Os Scripts de Shell são um grupo de comandos escritos em um arquivo de texto que dizem ao seu computador o que fazer e executam esses comandos. Os scripts de shell são semelhantes aos arquivos de lote no Windows. Eles podem incluir uma série de comandos, realizar tarefas complexas, fazer cálculos, usar palavras personalizadas e tomar decisões com base em certas condições. Os scripts de shell podem lidar com desde tarefas simples até inicializar um computador Linux inteiro. A maioria dos sistemas Linux usa um shell padrão chamado ‘bash’, que significa ‘Bourne Again SHell’.

Executando e depurando scripts de shell

Os scripts de shell podem ser abertos em qualquer editor de texto para ver o que eles fazem. No entanto, se um script de shell for grande ou complexo, ele pode ser executado mais lentamente do que programas compilados. Existem duas maneiras de executar um script de shell:

  1. Você pode usar o nome do arquivo como um argumento para o shell, como ‘bash meuscript’. Nesse método, o arquivo não precisa ser executável; ele simplesmente contém uma lista de comandos de shell. O shell especificado interpreta os comandos. Isso é comum para tarefas rápidas e simples.
  2. Você pode adicionar o nome do interpretador (como ‘#!/bin/bash’) na parte superior do script e tornar o arquivo do script executável usando ‘chmod +x nome_do_arquivo’. Em seguida, você pode executar o script como qualquer outro programa digitando seu nome na linha de comando.

Ao executar scripts, você pode fornecer opções na linha de comando, chamadas de argumentos de linha de comando. Para criar scripts eficazes:

  • Use comentários (linhas começando com #) para explicar seu código.
  • Construa scripts complexos passo a passo, testando cada parte antes de prosseguir.
  • Durante os testes, adicione declarações echo dentro de loops para ver o que seria executado sem fazer alterações permanentes. Insira declarações echo fictícias para confirmar que a lógica correta está sendo seguida. Use ‘set-x’ ou ‘bash -x nomedo_script’ para exibir cada comando executado.
  • À medida que os scripts crescem, priorize a legibilidade do código para torná-lo fácil de entender.

Compreendendo as variáveis de shell

Variáveis são usadas para armazenar informações para reutilização dentro de um script de shell.

Os nomes de variáveis em scripts de shell são sensíveis a maiúsculas e minúsculas, e certifique-se de que o nome e o valor toquem o sinal de igual, sem espaços.

Exemplo: NAME=valor

As variáveis podem ser inicializadas com constantes, incluindo texto, valores numéricos e sublinhados. Isso é especialmente útil para definir valores iniciais ou simplificar a entrada de constantes longas.

Exemplo: Color=”Roxo” Length=2.345

As variáveis podem armazenar a saída de um comando ou uma sequência de comandos. Isso pode ser feito usando o sinal de dólar seguido de um parêntese de abertura, colocando o comando dentro e fechando com um parêntese.

Exemplo:

# Armazenando a data em uma variável
hoje_data=$(date)

# Exibindo a data armazenada
echo "A data de hoje é: $hoje_data"

Parâmetros especiais de posição do shell
Variáveis especiais do shell no Linux fornecem informações úteis sobre a execução do script e os argumentos da linha de comando passados para ele.

Exemplo:

#!/bin/sh
# Script para exibir argumentos da linha de comando
echo "$0 representa o nome do script ou o comando usado para invocar o script."
echo "$1, $2, etc., representam os parâmetros de posição ou argumentos da linha de comando passados para o script. O primeiro argumento é $1, o segundo é $2."
echo "$# é o número total de argumentos."
echo "$@ é todos os argumentos."

“Foo” e “bar” são frequentemente usados como nomes de espaço reservado em documentação, tutoriais e exemplos para representar valores genéricos ou arbitrários. Eles são frequentemente usados ao demonstrar conceitos ou ilustrar código.

Lendo parâmetros

O comando “read” é usado para ler entrada do usuário ou de um arquivo e armazená-la em uma variável. É comumente usado para scripts interativos ou quando você precisa capturar a entrada do usuário durante a execução de um script de shell. É uma ferramenta fundamental para criar scripts interativos e é frequentemente usada para tarefas como ler a entrada do usuário, configurar configurações e coletar dados para processamento posterior em um script.

Exemplo:

#!/bin/sh
echo "Por favor, insira seu nome: "
read username
echo "Olá, $username!"

Expansão de parâmetros no bash

Na programação de shell bash, quando você deseja acessar o valor de uma variável, basta colocar um “$” na frente dela, como $NOME. Se você precisar incluir o valor da variável em uma sequência de texto sem espaços, pode usar chaves, como ${NOME}.

O bash oferece várias maneiras úteis de manipular os valores das variáveis. Aqui estão algumas técnicas comuns que você pode encontrar:

  • ${var:-valor} – Expande para ‘valor’ se ‘var’ estiver indefinido ou vazio.
  • ${var#padrão} – Remove o padrão mais curto do início de ‘var’.
  • ${var##padrão} – Remove o padrão mais longo do início de ‘var’.
  • ${var%padrão} – Remove o padrão mais curto do final de ‘var’.
  • ${var%%padrão} – Remove o padrão mais longo do final de ‘var’.

Essas técnicas ajudam você a trabalhar com os valores das variáveis de diferentes maneiras, permitindo que você os modifique e processe conforme necessário em seus scripts.

Realizando cálculos em scripts de shell

O Bash usa variáveis sem tipo, o que significa que geralmente trata as variáveis como strings de texto. Variáveis são tratadas como texto, a menos que você instrua o Bash de outra forma com o comando “declare”.

Ao realizar operações aritméticas em variáveis, o Bash as converte automaticamente em inteiros, se possível. Isso permite que você faça várias operações matemáticas no Bash.

Você pode realizar aritmética de números inteiros usando “let”, “expr” ou o comando “bc”. O comando “bc” é uma poderosa ferramenta de cálculo frequentemente disponível no Linux, e a variável “RANDOM” pode gerar números aleatórios entre 0 e 10.

Usando construções de programação em scripts de shell

Declarações “if…then”

Essa declaração permite que você execute ações somente quando condições específicas são atendidas.

Exemplo:

#!/bin/sh

# Exemplo 1 - Pode usar -eq em vez de =
VARIÁVEL=1
if [ $VARIÁVEL = 1 ] ; then
echo "A variável é 1"
fi

# Exemplo 2
STRING="Sexta-feira"
if [ $STRING = "Sexta-feira" ] ; then
echo "Uau. Sexta-feira."
else
echo "Será que sexta-feira vai chegar?"
fi

# Exemplo 3 - != significa "não igual a".
STRING="SEXTA-FEIRA"
if [ "$STRING" != "Segunda-feira" ] ; then
        echo "Pelo menos não é segunda-feira"
fi

# Exemplo 4 - elif (else if) é usado para testar uma condição adicional.
nome_do_arquivo="$HOME"
if [ -f "$nome_do_arquivo" ] ; then
        echo "$nome_do_arquivo é um arquivo regular"
elif [ -d "$nome_do_arquivo" ] ; then
        echo "$nome_do_arquivo é um diretório"
else
     echo "Eu não faço ideia do que é $nome_do_arquivo"
fi

No Bash, colchetes quadrados ( [ ] ) têm significado especial quando usados em declarações condicionais e testes. Eles são usados para encapsular condições e avaliar se essas condições são verdadeiras ou falsas. Colchetes quadrados são frequentemente usados em conjunto com a declaração “if” ou em vários comandos de teste.

Os dois pipelines ( || ) no Bash são usados para execução condicional de comandos. Eles permitem que você execute um segundo comando somente se o primeiro comando à esquerda falhar, ou seja, retornar um status de saída diferente de zero. (OU lógico)

# comando1 é o primeiro comando que você deseja executar
# comando2 é o segundo comando que você deseja executar se 'comando1' falhar.

comando1 || comando2

# Se 'comando1' tiver sucesso, 'comando2' não será executado e o script continuará.
# Se 'comando1' falhar, 'comando2' será executado.

Os dois e-comerciais ( && ) no bash são usados para execução condicional de comandos. Eles permitem que você execute um segundo comando somente se o primeiro comando à esquerda tiver sucesso, ou seja, retornar um status de saída zero. (E lógico)

# comando1 é o primeiro comando que você deseja executar.
# comando2 é o segundo comando que você deseja executar se 'comando1' tiver sucesso.

comando1 && comando2

# Se 'comando1' tiver sucesso, 'comando2' será executado.
# Se 'comando1' falhar, 'comando2' não será executado e o script continuará.

Combine os operadores && e || para criar uma instrução if…then…else em uma única linha.

O comando “case”

O comando “case” é usado como uma estrutura de controle para executar ações diferentes com base no valor de uma variável ou expressão. Ele permite testar uma variável em relação a várias sequências de padrões e executar blocos de código correspondentes ao primeiro padrão correspondente.

Exemplo:

# Forma geral do comando case

case "VAR" in 
  Resultado1)
    { corpo } ;;
  Resultado2)
    { corpo } ;;
  *)
    { corpo } ;;
esac

# "VAR" é a variável ou valor que você deseja testar em relação a vários padrões.

# "corpo" são os padrões que você deseja comparar com "VAR".

# Cada padrão é seguido por ")" e um bloco de código a ser executado se aquele padrão corresponder.

# "*" é um padrão genérico que corresponde se nenhum dos padrões anteriores corresponder. É semelhante ao caso "default" em uma instrução switch.

# Exemplo

#!/bin/sh

dia="Segunda-feira"

case "$dia" in
  "Segunda-feira")
    echo "É o início da semana."
    ;;
  "Sexta-feira")
    echo "Está quase no fim de semana!"
    ;;
*)
    echo "É um dia comum."
    ;;
esac

O loop “for…do”

Os loops são usados para executar ações repetidamente até que uma condição seja atendida ou até que todos os dados tenham sido processados.

No Bash, um loop “for…do” é uma estrutura de controle que permite iterar sobre uma lista de itens e executar uma série de comandos para cada item na lista. Ele é frequentemente usado quando você sabe quantas vezes deseja repetir um conjunto de comandos ou quando deseja iterar sobre elementos em uma matriz ou lista.

Exemplo:

# Forma geral do loop for...do

for VAR in LISTA
do
   { corpo } 
done

# 'VAR' é uma variável que representa o item atual na lista.
# 'LISTA' é a lista de itens sobre os quais você deseja iterar (por exemplo, uma lista de valores, uma faixa de números ou uma matriz).

# Exemplo 1
#!/bin/sh
cores=("azul" "roxo" "vermelho" "preto")

for cor in "${cores[@]}"
do
  echo "Eu gosto de $cor."
done

# Exemplo 2
#!/bin/sh

for numero in {1..4}
do
  echo "Este é o número $numero."
done

O loop “while…do” e “until…do”

A declaração “while” executa enquanto a condição for verdadeira. A declaração “until” executa até que a condição seja verdadeira, ou seja, enquanto a condição for falsa.

# Forma geral das declarações while...do e until...do

 while condição     until condição
 do                do
  { corpo }        { corpo }
done               done

Alguns programas úteis de manipulação de texto

O analisador de expressão regular geral

O comando “grep” (general regular expression print) é uma maneira de encontrar padrões em arquivos ou texto.

Exemplo:

grep "palavra_de_pesquisa" arquivo.txt


grep "padrão" arquivo.txt
grep "padrão" arquivo1.txt arquivo2.txt
grep -r "padrão" /home /etc/passwd

Removendo seções de linhas de texto

O comando “cut” pode extrair campos de uma linha de texto ou de arquivos. É especialmente útil para cortar seções específicas ou campos de linhas de texto. O “cut” é comumente usado para trabalhar com dados delimitados, como arquivos CSV ou arquivos de texto com campos separados por tabulações ou espaços.

cut [opções] [arquivo]

Traduzindo ou deletando caracteres

O comando “tr” é um tradutor baseado em caracteres que pode ser usado para substituir um caractere ou conjunto de caracteres por outro ou para remover um caractere de uma linha de texto.

tr [opções] CONJUNTO1 [CONJUNTO2]

O editor de fluxo

O comando “sed” é um editor simples e scriptável usado para manipulação de texto, transformações de texto e tarefas de edição, como pesquisa, substituição, inserção, exclusão e muito mais. Esse comando opera linha a linha, tornando-o adequado para processar eficientemente grandes fluxos de texto.

sed [opções] 'script' [arquivos_de_entrada]

# Um script contendo um ou mais comandos "sed" cercados por aspas simples ('').
# O script especifica as operações de manipulação de texto a serem executadas.
# Os arquivos de entrada são opcionais e são os arquivos nos quais você deseja aplicar os comandos "sed". Se não forem fornecidos, o "sed" lê da entrada padrão.

Espero que este artigo tenha fornecido uma compreensão abrangente dos scripts de shell e das técnicas de programação no ambiente do Bash. Com essas informações, você pode criar scripts de shell eficazes e automatizar tarefas em sistemas Linux.