Pesquisa de site

Como criar scripts de shell simples no Linux


Criar scripts de shell é uma das habilidades mais essenciais que os usuários do Linux devem ter na ponta dos dedos. Os scripts Shell desempenham um papel enorme na automatização de tarefas repetitivas que, de outra forma, seriam tediosas de serem executadas linha por linha.

Neste tutorial, destacamos algumas das operações básicas de shell script que todo usuário Linux deve ter.

1. Crie um script de shell simples

Um script de shell é um arquivo que contém texto ASCII. Começaremos criando um script de shell simples e, para isso, usaremos um editor de texto. Existem vários editores de texto, tanto de linha de comando quanto baseados em GUI. Para este guia, usaremos o editor vim.

Começaremos criando um script simples que exibe “Hello world” quando executado.

vim hello.sh

Cole o seguinte conteúdo no arquivo e salve.

#!/bin/bash
Print Hello world message
echo "Hello World!"

Vamos examinar o shell script linha por linha.

  • A primeira linha – #!/bin/bash – é conhecida como cabeçalho shebang. Esta é uma construção especial que indica qual programa será usado para interpretar o script. Neste caso, este será o shell bash indicado por /bin/bash. Existem outras linguagens de script, como Python, que é denotada por #!/usr/bin/python3 e Perl, cujo cabeçalho shebang é denotado por #!/usr/bin/perl.
  • A segunda linha é um comentário. Um comentário é uma declaração que descreve o que um script de shell faz e o que não é executado quando o script é executado. Os comentários são sempre precedidos pelo sinal de hash #.
  • A última linha é o comando que imprime a mensagem ‘Hello World’ no terminal.

A próxima etapa é tornar o script executável atribuindo permissão de execução usando o comando chmod conforme mostrado.

chmod +x  hello.sh

Finalmente, execute o script shell usando um dos comandos:

bash hello.sh
OR
./hello.sh

2. Usando instruções condicionais para executar código

Como outras linguagens de programação, declarações condicionais são usadas em scripts bash para tomar decisões, com apenas uma ligeira variação na sintaxe. Abordaremos as declarações condicionais if, if-else e elif.

Exemplo de apenas uma instrução if

A instrução if pode ser usada para testar condições únicas ou múltiplas. Começaremos com o uso fundamental da instrução if para testar uma única condição. A instrução if é definida pelos blocos if ... fi.

if command
then
  statement
fi

Vamos dar uma olhada no script de shell abaixo.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

O script de shell acima solicita que o usuário forneça uma pontuação que é então armazenada em uma variável x. Se a pontuação corresponder a 70, o script retornará a saída “Bom trabalho! ”. O operador de comparação == é utilizado para testar se a pontuação inserida, que está armazenada na variável x, é equivalente a 100.

Outros operadores de comparação que você pode usar incluem:

  • -eq – Igual a
  • -ne – Diferente de
  • -lt – Menor que
  • -le – Menor ou igual a
  • -lt – Menor que
  • -ge – Maior ou igual a

Por exemplo, o bloco if-statement abaixo imprime ‘Work Harder’ se a pontuação de entrada for qualquer valor menor que 50.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

Exemplo de uma instrução if-else

Para situações em que você tem 2 resultados possíveis: – seja isto ou aquilo – a instrução if-else é útil.

if command
then
  statement1
else
  statement2
fi

O script abaixo lê a pontuação de entrada e verifica se ela é maior ou igual a 70.

Se a pontuação for maior ou igual a 70, você receberá a mensagem ‘Ótimo trabalho, você passou!’. No entanto, se a pontuação ficar abaixo de 70, a saída ‘Você falhou’ será impressa.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

Exemplo de uma instrução if-elif-else

Em cenários onde existem múltiplas condições e resultados diferentes, a instrução if-elif-else é usada. Esta declaração assume o seguinte formato.

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

Por exemplo, temos um script para uma loteria que verifica se o número inserido é 90, 60 ou 30.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. Usando a instrução If com lógica AND

Você pode usar a instrução if juntamente com o operador lógico AND para executar uma tarefa se duas condições forem satisfeitas. O operador && é usado para denotar a lógica AND.

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. Usando a instrução If com lógica OR

Ao usar a lógica OR, que é representada pelo símbolo ||, qualquer uma das condições precisa ser satisfeita com o script para fornecer os resultados esperados.

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

Use construções de loop

Bash loops permitem que os usuários executem uma série de tarefas até que um determinado resultado seja alcançado. Isso é útil na execução de tarefas repetitivas. Nesta seção, daremos uma olhada em alguns dos loops que você também encontrará em outras linguagens de programação.

Enquanto loop

Este é um dos loops mais fáceis de trabalhar. A sintaxe é bastante simples:

while  <some test>
do
 commands
done

O loop while abaixo lista todos os números de 1 a 10 quando executado.

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

Vamos discutir o loop while:

A variável counter é inicializada em 1. E enquanto a variável for menor ou igual a 10, o valor do contador será incrementado até que a condição seja satisfeita. A linha echo $counter imprime todos os números de 1 a 10.

Para loop

Assim como o loop while, um loop for é usado para executar o código iterativamente. Ou seja repita a execução do código quantas vezes for possível definido pelo usuário.

A sintaxe é:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

O loop for abaixo itera de 1 a 10 e processa seus valores na tela.

A melhor maneira de conseguir isso é definir um intervalo usando chaves duplas { } conforme mostrado, em vez de digitar todos os números.

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Parâmetros posicionais do Bash

Um parâmetro posicional é uma variável especial referenciada no script quando valores são passados no shell, mas não podem ser atribuídos. Os parâmetros posicionais vão de $0 $1 $2 $3 …… a $9. Além do valor $9, os parâmetros devem ser colocados entre chaves, por exemplo, $ {10}, $ {11}… e assim por diante.

Ao executar o script, o primeiro parâmetro posicional que é $0 leva o nome do shell script. O parâmetro $1 pega a primeira variável que é passada no terminal, $2 pega a segunda, $3 a terceira e assim por diante.

Vamos criar um script test.sh conforme mostrado.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

Em seguida, execute o script e forneça o primeiro e o segundo nome como argumentos:

bash test.sh James Kiarie

Na saída, podemos ver que a primeira variável impressa é o nome do shell script, neste caso, test.sh. Depois disso, os nomes são impressos correspondendo aos parâmetros posicionais definidos no shell script.

Os parâmetros posicionais são úteis porque ajudam a personalizar os dados que estão sendo inseridos, em vez de atribuir explicitamente um valor a uma variável.

Códigos de saída de comando Shell

Vamos começar respondendo a uma pergunta simples: O que é um código de saída?

Cada comando executado no shell por um usuário ou script de shell possui um status de saída. Um status de saída é um número inteiro.

Um status de saída 0 implica que o comando foi executado com sucesso e sem erros. Qualquer valor entre 1 a 255 mostra que o comando falhou ou não foi executado com êxito.

Para encontrar o status de saída de um comando, use a variável Shell $?.

Um status de saída 1 indica um erro geral ou qualquer erro inadmissível, como edição de arquivos sem permissões sudo.

Um status de saída de 2 aponta para o uso incorreto de um comando ou variável interna do shell.

O status de saída 127 aponta para um comando ilegal que geralmente gera o erro ‘comando não encontrado’.

Processando saída de comandos Shell em um script

No script bash, você pode armazenar a saída de um comando em uma variável para uso futuro. Isso também é conhecido como substituição de comando shell e pode ser alcançado das seguintes maneiras.

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

Por exemplo, você pode armazenar o comando data em uma variável chamada hoje e chamar o script de shell para revelar a data atual.

#!/bin/bash

today=$(date)

echo “Today is $today”

Vejamos outro exemplo. Suponha que você queira encontrar os usuários de login válidos em seu sistema Linux. Como você faria isso? Primeiro, a lista de todos os usuários (usuários do sistema, do processo e de login) é armazenada no arquivo /etc/passwd.

Para visualizar o arquivo, você precisa usar o comando cat. No entanto, para restringir o login de usuários, use o comando grep para procurar usuários com o atributo /bin/bash e use o comando cut -c 1-10 como mostrado para exibir os primeiros 10 caracteres dos nomes.

Armazenamos o comando cat na variável login_users.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

Isso encerra nosso tutorial sobre como criar scripts de shell simples. Esperamos que você tenha achado isso valioso.