Introdução ao Shell Script
O artigo traz uma introdução a Shell Script. Criaremos alguns exemplos práticos para que você consiga criar seus próprios scripts de automatização. Shell Script é um tipo de linguagem de programação que é utilizado por administradores Linux/Unix. Também é possível criar scripts para outros sistemas operacionais, mas o meu foco aqui será mesmo os sistemas Linux e suas distribuições.
Parte 5: Usando laços e condicionais em Shell Script
Usando o laço FOR em Shell Script
Podemos usar um laço for, que pode ser interpretado da seguinte maneira: Enquanto uma condição for verdadeira faça os seguintes comandos.Para ilustrar este exemplo criaremos um documento de texto chamado lista.txt com os seguintes dados:
Esta é a linha: 1
Esta é a linha: 2
Esta é a linha: 3
Esta é a linha: 4
Esta é a linha: 5
Esta é a linha: 6
Esta é a linha: 7
Esta é a linha: 8
Esta é a linha: 9
Esta é a linha: 10
Esta é a linha: 2
Esta é a linha: 3
Esta é a linha: 4
Esta é a linha: 5
Esta é a linha: 6
Esta é a linha: 7
Esta é a linha: 8
Esta é a linha: 9
Esta é a linha: 10
O script a seguir vai ler as linhas do arquivo acima:
#!/bin/bash for line in $(cat lista.txt) do echo "$line" done
A seguir mostro a execução dele na tela:
Usando o laço While em Shell Script
Nós podemos usar o laço while que é mais simples que o laço for, neste caso também leremos as linhas do arquivo lista.txt:#!/bin/bash while read LINE do echo $LINE done < lista.txt
A seguir mostro a execução dele na tela:
Usando o Case em Shell Script
Agora iremos usar a condição case que é muito útil quando quiser dar mais opções para o usuário.Neste script criaremos duas opções para o usuário, uma opção será listar o conteúdo do /etc/init.d, a outra opção será listar o conteúdo do diretório /etc/kernel, caso o usuário digite qualquer outra coisa diferente destas duas opções será apresentado uma mensagem de erro para o usuário.
A seguir mostro o script:
#!/bin/bash
echo "Script criado para o uso Case"
echo "Opção 1: Listar o conteúdo de /etc/init.d"
echo "Opção 2: Listar o conteúdo de /etc/kernel"
read OPCAO
case $OPCAO in
1)
echo "Você escolheu a opção $OPCAO "
ls /etc/init.d;;
2)
echo "Você escolheu a opção $OPCAO "
ls /etc/kernel;;
*)echo "Você não digitou uma opção válida";;
esac
A seguir mostro a execução dele na tela:
Criando um menu em Shell Script
Neste próximo script apresentaremos para o usuário um menu de opções, que podemos com este exemplo criar quantas opções quiser, este será bem simples somente para mostrar a estrutura lógica.Usaremos o exemplo acima para exemplificar somente adicionando uma terceira opção que será a opção de sair do script.
É muito simples transformar o script acima em um menu, o que precisamos fazer é adicionar um laço While no script e também adicionarmos o comando "sleep" para que consigamos ver na tela o resultado do comando:
#!/bin/bash while true do clear; #Scripts e comandos done
Nosso script de menu completo ficará assim:
#!/bin/bash
while true
do
clear;
echo "Script criado para o uso Case"
echo "Opção 1: Listar o conteúdo de /etc/init.d"
echo "Opção 2: Listar o conteúdo de /etc/kernel"
echo "Opção 3: Sair"
read OPCAO
case $OPCAO in
1)
echo "Você escolheu a opção $OPCAO "
ls /etc/init.d
sleep 3;;
2)
echo "Você escolheu a opção $OPCAO "
ls /etc/kernel
sleep 3;;
3)
echo "Você escolheu a opção $OPCAO "
sleep 3
exit;;
*)echo "Você não digitou uma opção válida"
sleep 3;;
esac
done
A seguir mostro a execução dele na tela:
Usando o IF em Shell Script
Descrevo aqui uma simples opção onde verificaremos se o diretório (/etc/teste) existe ou não.Para este tipo de verificação usamos a seguinte sintaxe:
#!/bin/bash if [ -e "/etc/teste" ] then echo "O diretório existe" else echo "O diretório não existe" fi
Obs.: note que no comando if existe a opção -e, que significa "Se existir", você pode seguir a tabela a seguir para criar as suas próprias condicionais:
-eq Igual -ne Diferente -gt Maior -lt Menor -o Ou -d Se for um diretório -e Se existir -z Se estiver vazio -f Se conter texto -o Se o usuário for o dono -r Se o arquivo pode ser lido -w Se o arquivo pode ser alterado -x Se o arquivo pode ser executadoA seguir mostro a execução dele na tela:
Um outro exemplo que posso mostrar é quando perguntamos algo ao usuário e dependendo do que for digitado, seguirá um caminho. Apresentaremos para o usuário a pergunta "Quer listar o conteúdo de "/etc/init.d", caso positivo será listado senão não será feito nada.
Para que isso ocorra a nossa sintaxe deve ficar assim:
#!/bin/bash printf "Deseja exibir estas informações /etc/init.d ?" read OPCAO if [[ $OPCAO == "S" || $OPCAO == "s" ]] then echo 'O conteúdo será exibido' ls /etc/init.d else echo 'O conteúdo não será exibido' echo "" fi
A seguir mostro a execução dele na tela:
Opções úteis do comando test
Descrevo aqui algumas opções, porém todas as opções podem ser verificadas usando o comando que consulta as "Man Pages":# man test
File operators:
-a FILE True if file exists.
-b FILE True if file is block special.
-c FILE True if file is character special.
-d FILE True if file is a directory.
-e FILE True if file exists.
-f FILE True if file exists and is a regular file.
-g FILE True if file is set-group-id.
-h FILE True if file is a symbolic link.
-L FILE True if file is a symbolic link.
-k FILE True if file has its `sticky' bit set.
-p FILE True if file is a named pipe.
-r FILE True if file is readable by you.
-s FILE True if file exists and is not empty.
-S FILE True if file is a socket.
-t FD True if FD is opened on a terminal.
-u FILE True if the file is set-user-id.
-w FILE True if the file is writable by you.
-x FILE True if the file is executable by you.
-O FILE True if the file is effectively owned by you.
-G FILE True if the file is effectively owned by your group.
-N FILE True if the file has been modified since it was last read.
FILE1 -nt FILE2 True if file1 is newer than file2 (according to
modification date).
FILE1 -ot FILE2 True if file1 is older than file2.
FILE1 -ef FILE2 True if file1 is a hard link to file2.
All file operators except -h and -L are acting on the target of a symbolic
link, not on the symlink itself, if FILE is a symbolic link.
String operators:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.