Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Introdução ao Shell Script no Linux, Manuais, Projetos, Pesquisas de Matérias técnicas

Este artigo fornece uma introdução à criação de scripts no shell do linux utilizando o interpretador de comandos bash em sistemas unix-like. Aprenda a criar, editar e executar arquivos de scripts para automatizar tarefas rotineiras e repetitivas no dia a dia.

Tipologia: Manuais, Projetos, Pesquisas

2021

Compartilhado em 02/09/2021

icpauloti.jobs
icpauloti.jobs 🇧🇷

2 documentos

1 / 21

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
08/10/2015 Introdução ao Shell Script no Linux
data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo…
1/21
IntroduçãoaoShellScriptno
Linux
Vejanesteartigocomocriarcódigosparaautomatização
detarefasrotineirasutilizandoointerpretadorde
comandosbashemsistemasUnixlike.Serãodadosos
conceitosbásicoseassintaxeseexplicaçõesdos
principaiscomandos.
Gostei(10) (2)
Podemosutilizaracriaçãodearquivosdescriptsparatornarmaissimplesasexecuçõesde
tarefasrepetitivasnodiaadia.Muitotempodoprogramadoréempregadoemaçõesdesse
tipo,comoabrirosmesmosprogramastodososdias;esvaziaralixeiraediretóriostemp
paraeconomizarespaçoemdisco;etc.
Umscriptnadamaisédoqueumalgoritmoprojetadopararealizarumadeterminadatarefa,
utilizandooscomandosespecíficosdobasheosexecutáveisdosistemaoperacional.
Lembresedeexecutaroscomandoscomousuáriocomumenãocomoroot,vistoque,
comoroottudoseráaceitoe,dependendodoquevocêfizer,istopodegerardanosao
sistemaoperacional.Umamaneirafácildeverificaréabriroterminaleseosímboloantes
docursoréo'$',vocêestácomousuáriocomum,masseéo'#',vocêestácomoroot.Para
sairdomodoroot,digite:
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15

Pré-visualização parcial do texto

Baixe Introdução ao Shell Script no Linux e outras Manuais, Projetos, Pesquisas em PDF para Matérias técnicas, somente na Docsity!

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 1/

Introdução ao Shell Script no

Linux

Veja neste artigo como criar códigos para automatização

de tarefas rotineiras utilizando o interpretador de

comandos bash em sistemas Unix like. Serão dados os

conceitos básicos e as sintaxes e explicações dos

principais comandos.

Gostei (10) (2)

Podemos utilizar a criação de arquivos de scripts para tornar mais simples as execuções de

tarefas repetitivas no dia a dia. Muito tempo do programador é empregado em ações desse

tipo, como abrir os mesmos programas todos os dias; esvaziar a lixeira e diretórios temp

para economizar espaço em disco; etc.

Um script nada mais é do que um algoritmo projetado para realizar uma determinada tarefa,

utilizando os comandos específicos do bash e os executáveis do sistema operacional.

Lembre se de executar os comandos como usuário comum e não como root, visto que,

como root tudo será aceito e, dependendo do que você fizer, isto pode gerar danos ao

sistema operacional. Uma maneira fácil de verificar é abrir o terminal e se o símbolo antes

do cursor é o '$', você está como usuário comum, mas se é o '#', você está como root. Para

sair do modo root, digite:

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 2/

exit

Criação do shell script

Em primeiro lugar precisaremos de um arquivo para escrever o nosso script. Podemos fazer

isso via terminal ou via modo gráfico, sendo que, no último caso, basta apenas clicar com o

botão direito do mouse em um diretório desejado e escolher "criar novo arquivo de texto" ou

“criar novo documento”.

Para criar um arquivo via terminal, basta abrir o mesmo e digitar:

vi exemplo 1 .sh

Também podemos fazer:

touch exemplo 1 .sh

O comando vi cria e abre um arquivo para leitura/escrita no terminal, enquanto o comando

touch cria um arquivo, mas não o abre. Posteriormente é possível abri lo com um editor de

sua preferência.

Concedendo permissões ao arquivo

Para editar o arquivo, precisamos dar permissão de escrita a ele.

Para a primeira alternativa, em que o vi abriu direto o arquivo, precisamos pressionar ESC

para editá lo, assim, ao se fazer isso, o caractere ':' aparece, então digite:

!chmod 7 7 7 %

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 4/

#!/bin/SHELL_ATUAL

Figura 1. Execução do código bash

Como vemos na Figura 1 , a primeira linha de um shell script define qual o interpretador de

comandos será utilizado.

Note que utilizamos o path completo de onde se encontra o shell, no caso, no diretório /bin/.

Após isso, é hora de iniciarmos o nosso script. Para este artigo, o exemplo imprimirá na tela

algumas informações sobre o usuário e o computador, conforme o código da Listagem 1.

Listagem 1. Código do exemplo1.sh

#!/bin/bash echo "Seu nome de usuário é:" whoami echo "Info de hora atual e tempo que o computador está ligado:" uptime echo "O script está executando do diretório:" pwd

Este código nos fornece algumas informações sobre o usuário, algumas informações da

máquina e sobre o local de armazenamento do nosso script.

Para salvarmos o arquivo digitamos ESC e depois “:wq” para gravar as alterações e sair.

Para executar o script, há dois pontos a considerar:

1. Se você tiver salvo o seu arquivo no diretório atual, basta executá lo digitando no

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 5/

prompt:

./exemplo 1 .sh

2. Se você tiver salvo o seu arquivo em outro diretório qualquer, você precisará informar

o path completo até ele. Considerando que ele esteja em /tmp/scripts:

/tmp/scripts/exemplo 1 .sh

O comando echo exibe na tela a string entre aspas duplas. Caso você não queira que

ela fique entre aspas duplas, simplesmente não as forneça no comando echo;

O comando whoami exibe o usuário logado no sistema;

O comando uptime exibe a hora atual, o tempo decorrido desde que o computador foi

ligado, o número de usuários logados e uma média do número de processos

carregados nos últimos um, cinco e 15 minutos;

O comando pwd exibe o diretório no qual o arquivo está rodando.

Toda string que contiver espaços deve estar entre aspas duplas.

Inserindo comentários

Comentários em códigos são muito importantes. Explicar o que está sendo feito e dar

informações sobre o funcionamento do código permite ao desenvolvedor economizar tempo

para entendê lo.

Para inserir comentários no seu script, basta iniciar a linha com o caractere '#', como no

código da Listagem 2 e execução na Figura 2.

Listagem 2. Shell script com comentários.

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 7/

Nota: Observe que não deve haver espaços entre o sinal de igual e o nome e o valor da

variável.

Para utilizarmos o valor da variável coloca se o $ (cifrão) na frente de seu nome, como

mostra o exemplo da Listagem 3.

Listagem 3. Declarando e utilizando variáveis.

#!/bin/bash site=www.devmedia.com.br meu_numero_favorito= 13 _cidade=”Porto Alegre” echo “Um ótimo site para você aprender a programar e se manter atualizado é: $site” echo “Meu número favorito é: $meu_numero_favorito” echo “Minha cidade natal é: $_cidade”

Agora, se você deseja printar o nome da própria variável, basta colocar uma barra invertida

'' antes do $, assim, ela nega o caractere seguinte e normalmente é utilizada para

caracteres de scape (ou seja, caracteres que já tem uma função específica, mas que você

deseja somente utilizar em um nome ou valor, sem executá los). Vejamos um exemplo

na Listagem 4.

Listagem 4. Printando o nome de uma variável ao invés de seu conteúdo.

#!/bin/bash nome=fernanda echo “O nome da variável é $nome”

Atribuindo saídas de comandos a variáveis

É possível armazenar o resultado de um comando em uma variável. Isso é muito útil em

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-bo… 8/

situações em que se usará este resultado em mais de um lugar ao longo do script.

Há duas sintaxes para isso:

1. nome_da_variavel=$(comando)

2. nome_da_variavel=comando

Você pode escolher a que melhor lhe agrada ou empregar as duas nos seus scripts.

O próximo exemplo lista as informações relativas a todos os discos e partições do sistema:

#!/bin/bash system_info=df -h # Também poderia ser system_info=$(df -h) echo “$system_info”

Veja que o comando df h executará e a sua saída (resultado dessa execução) será

armazenada na variável system_info.

Capturando a entrada de dados do usuário

Pode ser que o seu script precise interagir com o usuário, pedindo para ele fornecer algum

dado de entrada para processamento. Neste caso, é necessário que se leia o que o usuário

digitou e isso é feito através do seguinte comando:

read nome_da_variavel_para_armazenar_o_valor_a_ser_lido

Vejamos o exemplo da Listagem 5.

Listagem 5. Utilizando o comando read para ler entrada do usuário.

#!/bin/bash

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 10/

Mas normalmente se utiliza os colchetes por ser mais compacto e para ficar mais

semelhante ao formato em outras linguagens. De qualquer forma, a escolha é sua.

Nota: Em outras linguagens de programação o if testa uma condição, mas em shell script o

if testa a saída de um comando.

Vamos a um exemplo em que o usuário deverá digitar um número e verificaremos se ele

está em um determinado intervalo, como mostra a Listagem 6.

Listagem 6. Utilizando o condicional if...then

#!/bin/bash echo “Digite um número qualquer:” read numero; if [ “$numero” -gt 20 ]; then echo “Este número é maior que 2 0 !” fi

Veja a seguir os parâmetros mais comuns utilizados com o comando test:

n string1: o comprimento de string1 é diferente de 0;

z string1: o comprimento de string1 é zero;

string1 = string2: string1 e string2 são idênticas;

string1 != string2: string1 e string2 são diferentes;

inteiro1 eq inteiro2: inteiro1 possui o mesmo valor que inteiro2;

inteiro1 ne inteiro2: inteiro1 não possui o mesmo valor que inteiro2;

inteiro1 gt inteiro2: inteiro1 é maior que inteiro2;

inteiro1 ge inteiro2: inteiro1 é maior ou igual a inteiro2;

inteiro1 lt inteiro2: inteiro1 é menor que inteiro2;

inteiro1 le inteiro2: inteiro1 é menor ou igual a inteiro2;

e nome_do_arquivo: verifica se nome_do_arquivo existe;

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 11/

d nome_do_arquivo: verifica se nome_do_arquivo é um diretório;

f nome_do_arquivo: verifica se nome_do_arquivo é um arquivo regular (texto,

imagem, programa, docs, planilhas).

O comando else

Existe a possibilidade de também tratar o caso em que o nosso teste falha. Para isso temos

o comando else, cuja sintaxe é:

if [ CONDICAO ]; then AÇÕES_ 1 else AÇÕES_ 2 fi

Onde:

CONDICAO: teste que, se verdadeiro, passará o controle para o bloco dentro do then;

AÇÕES_1: comandos a serem executados se o resultado de CONDICAO for

verdadeiro;

AÇÕES_2: comandos a serem executados se o resultado de CONDICAO for falso.

Vejamos um exemplo na Listagem 7 que verifica se um número digitado pelo usuário é

positivo ou negativo.

Listagem 7. Utilizando o condicional if...then...else.

#!/bin/bash echo “Digite um número qualquer:” read numero; if [ “$numero” -ge 0 ]; then

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 13/

Baseado nesta escolha, a hora e a data serão exibidas; uma divisão será efetuada e seu

resultado será exibido, e uma mensagem será exibida com o nome que o usuário fornecer,

como mostra a Listagem 8.

Listagem 8. Utilizando o comando elif.

#!/bin/bash echo "Selecione uma opção:" echo "1 - Exibir data e hora do sistema" echo "2 - Exibir o resultado da divisão 1 0 / 2 " echo "3 - Exibir uma mensagem” read opcao; if [ $opcao == " 1 " ]; then data=$(date +"%T, %d/%m/%y, %A") echo "$data" elif [ $opcao == " 2 " ]; then result=$(( 10 / 2 )) echo "divisao de 1 0 /2 = $result" elif [ $opcao == " 3 " ]; then echo "Informe o seu nome:" read nome; echo "Bem-vindo ao mundo do shell script, $nome!" fi

Nota: O bash não tem suporte nativo a divisões em ponto flutuante, apenas divisões

inteiras. Caso queira efetuar este tipo de operação, precisará de um comando externo,

como dc ou bc.

Nota: Observe a linha:

result=$(( 10 / 2 ))

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 14/

Veja que utilizamos dois conjuntos de parênteses para encapsular a operação de divisão.

Em shell script precisamos realizar operações matemáticas entre parênteses.

O comando case

O comando case tem a mesma funcionalidade do if...then...elif, com a diferença de sua

sintaxe ser mais compacta e enxuta:

case VARIAVEL in CASO_ 1 ) AÇÕES_ 1 ;; CASO_ 2 ) AÇÕES_ 2 ;; CASO_N) AÇÕES_N ;; esac

Onde:

VARIAVEL: variável que terá seu valor verificado;

CASO_1 … CASO_N: possíveis estados da variável;

AÇÕES_1 … AÇÕES_N: ações a serem tomadas caso a variável combine com

CASO_1 … CASO_N, respectivamente.

Por exemplo, modificando o exemplo anterior temos o código da Listagem 9.

Listagem 9. Utilizando o comando case.

#!/bin/bash echo "Selecione uma opção:" echo "1 - Exibir data e hora do sistema" echo "2 - Exibir o resultado da divisão 1 0 / 2 "

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 16/

AÇÕES: ações a serem tomadas repetidamente até que o valor de VARIAVEL

ultrapasse o último valor informado no conjunto de valores fornecido.

NOTA: A sequência VALOR_1, VALOR_2 … VALOR_N; na sintaxe pode ser substituída

por:

{VALOR_ 1 ..VALOR_N};

Observe que são apenas duas reticências.

Quando o loop for começa, a variável é inicializada com o primeiro valor do conjunto, e

ocorre a primeira iteração (entrada no laço e execução dos comandos). Para as iterações

seguintes, os valores do conjunto serão atribuídos à variável, sucessivamente, até que se

alcance o último e o loop termine a execução.

Veja o exemplo da Listagem 10 , que conta decrescendo de 10 a 0.

Listagem 10. Exemplo de uso do loop for.

#!/bin/bash echo “Testando o loop for” for i in { 10 .. 0 }; do echo “$i” done

Outra forma de criarmos sequências de valores é com o comando seq , como mostra

a Listagem 11.

Listagem 11. Exemplo de uso do loop for com o comando seq com intervalo.

#!/bin/bash

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 17/

echo “Testando o comando seq” for i in $(seq 1 5 1 00 ); do echo “$i” done

Observe que foi criada uma sequência de 1 até 100, com intervalo de 5.

Agora, na Listagem 12 temos um exemplo de loop sem intervalo.

Listagem 12. Exemplo de uso do loop for com o comando seq sem intervalo.

#!/bin/bash echo “Testando o comando seq” for i in $(seq 1 1 00 ); do echo “$i” done

Observe que foi criada uma sequência de 1 até 100, de 1 em 1.

Loop while

Enquanto o loop for é mais ideal para quando sabemos até quanto contar, o loop while é

bom para quando não temos essa noção, mas sabemos de uma condição que deverá ser

atendida para que o laço termine. Sua sintaxe é:

while [ CONDICAO ]; do AÇÕES done

Onde:

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 19/

algoritmo, seja em shell script ou qualquer outra linguagem de programação. Sua sintaxe é

muito simples:

nome_funcao() { AÇÕES }

Funções podem chamar outras funções existentes no script, simplesmente escrevendo se o

nome dela, como vemos no exemplo da Listagem15.

Listagem 15. Exemplo de uso de funções.

#!/bin/bash main() { echo "Escolha uma opção:" echo "1 - Esvaziar a lixeira" echo "2 - Calcular fatorial" read opcao; case $opcao in " 1 ") esvaziar_lixeira ;; " 2 ") calcular_fatorial ;; esac } esvaziar_lixeira() { echo "Esvaziando a lixeira..." path="${HOME}/.local/share/Trash/files" cd "$path" for file in * do rm -rf "$file" done echo "Done!" }

data:text/html;charset=utf-8,%3Cheader%20style%3D%22-webkit-tap-highlight-color%3A%20transparent%3B%20padding-b… 20/

calcular_fatorial() { echo "Informe um número:" read numero; i= 1 fat= 1 while [ $i -le $numero ] do fat=$(($fat*$i)) i=$(($i+ 1 )) done echo "fatorial de $numero é $fat" } main

Nota: Lembre se sempre de chamar a função principal (no nosso caso, main) no final do

seu script, do contrário, nada acontecerá quando você o executar.

Argumentos

Normalmente um programa recebe argumentos como entrada, ou seja, dados fornecidos

pelo usuário ou por outro programa, os quais devem ser “consumidos” para produzir as

saídas desejadas.

Em shell script não poderia ser diferente: temos nomes especiais para designar os

argumentos recebidos por um script:

$0 – contém o nome do script que foi executado;

$1 … $n – contêm os argumentos na ordem em que foram passados (1º argumento

em $1, 2º argumento em $2, etc.).

$# contém o número de argumentos que foi passado (ou seja, não considera o nome

do script em $0);

$* retorna todos os argumentos de uma vez só.