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ó.