105.2 Customize ou Escreva Scripts Simples (Peso 4)
Canditados devem ser capazes de alterar scripts simples ou escrever novos scripts em bash
- Utilizar a sintaxe padrão de loops
- Utilizar testes
- Utilizar substituição de comando
- Testar valores de retorno, para verificar falha ou sucesso ou outras informações forncecidas por um comando
- Realizar envio de email condicional para o super usuário
- Escolher corretamente o interpretador do script com o uso do She-Bang
- Gerenciar a localização, dono e execução e permissões suid de scripts
Um script nada mais é do que um conjunto de comandos salvos em um arquivo, sendo que esses comandos são executados seguindo determinada ordem.
Estrututa básica de um arquivo de script bash
Veja abaixo o conteúdo do arquivo imprimir.sh que realiza a simples tarefa de imprimir a mensagem “Isso é um script bash.” No terminal. Para isso utilizamos o comando echo:
echo "Isso é um script bash."
Para executar esse script devemos entrar no diretório ~/Scripts e em seguida executar um dos comandos abaixo no terminal.
Podemos apenas chamar o interpretador do bash e em seguida o nome do arquivo:
bash imprimir.sh
Ou com interpretador sh:
sh imprimir.sh
Ou ainda o comando exec. Logo após o término do script sua sessão atual do bash será encerrada, essa é o comportamento do comando exec:
exec imprimir.sh
Veja que até o momento nosso arquivo não possui permissão de execução:
ls -l imprimir.sh
-rw-rw-r-- 1 alphabraga alphabraga 30 Aug 5 18:28 imprimir.sh
Podemos executar o script sem que seja necessário chamar um interpretador de forma explícita. Basta usarmos o She-Bang
. Que nada mais é do que uma anotação que fica no cabeçalho do script indicando qual interpretador deve ser chamado no momento que o arquivo for executado.
Dessa forma não se faz nessário a utilização do comando bash. O script ficaria assim:
#!/bin/bash
echo "Isso é um bash script."
Mas para de fato o script funcionar precisamos ainda colocar a permissão de execução nele.
chmod +x imprimir.sh
Agora sim! Basta executar o comando abaixo para que o script seja executado com sucesso.
./imprimir.sh
Isso é um bash script.
if
A sintaxe do comando if:
#!/bin/bash
# sintaxe com [
if [ 1 -eq 1 ];
then
echo "1 é igual a 1"
fi
# sintaxe sem [, e usando o test
if test 1 -eq 1 ;
then
echo "1 é igual a 1"
fi
regex="[a-c]"
# sintaxe com [[, e usando uma regex, veja que não tem o ;
if [[ 'abc' =~ $regex ]]
then
echo "abc"
fi
## Sintaxe com else if (TEM QUE FECHAR COM fi no final perceba a quebra de linha)
if [ "GET" == "GET" ]
then
echo true
else
if [ "POST" == "POST" ]
then
echo false
fi
fi
test
O Comando test retorna valores de sucesso ou falha ou outras informações fornececidas pelo script. No terminal podemos utilizar o comando test, logo abaixo vamos verificar a existência do arquivo ~/.bashrc
test -f ~/.bashrc
echo $?
0
Como podemos ver o comando retornou 0, ou seja, o arquivo existe. Agora vamos procurar de forma intencional por um arquivo que não existe em nosso sistema de arquivos:
test -f ~/arquivo-invalido
echo $?
1
O comando retornou 1. Dessa forma sabemos que o arquivo não existe.
Vejamos abaixo os tipos de testes que podem ser realizados:
( EXPRESSÃO )
Verificamos se uma expressão é verdadeira
test 1 -eq 1
echo $?
0
! EXPRESSÃO
Verificamos se a expressão é falsa
test ! 1 -eq 2
echo $?
0
-a (AND)
Verificamos se duas expressões são verdadeiras
test 1 -eq 1 -a 1 -eq 1
echo $?
0
-o (OR)
Verificamos se uma das duas expressões são verdadeiras
test 1 -eq 1 -o 1 -eq 2
echo $?
0
-z STRING
Verificamos se uma string tem comprimento igual a zero:
if test "" -z ; then
echo "A string não possui caracateres"
fi
-n STRING
Verificamos se o tamanho de uma string é diferente de zero
test -n "linux"
echo $?
0
test -n ""
echo $?
1
test -n
echo $?
1
STRING = STRING
Verificamos se as strings são iguais
test linux = linux
echo $?
0
test linux = linuZ
echo $?
1
STRING != STRING
Verificamos se as strings são diferentes
test linux != linuZ
echo $?
0
STRING =~ REGEX
Criamos um regex e em seguida testamos
regex="[abc]"
if[[ 'abc' =~ $regex ]]
then
echo "é igual"
fi
Comparando Inteiros
-eq
Igual teste 1 -eq 1
-ge (greater than or equal)
Maoir que ou igual teste 10 -ge 9
-gt (maior que)
INTEGER1 -gt INTEGER2
-le (menor que, ou igual)
INTEGER1 -le INTEGER2
-lt (menor que )
INTEGER1 -lt INTEGER2
-ne (not equal)
INTEGER1 -ne INTEGER2
Operadores para arquivos
- -d Verifica se o arquivo existe e se é um diretório.
- -e Verifica se o arquivo existe.
- -f Verifica se o arquivo existe e se é um arquivo regular.
- -r Verifica se o arquivo existe e se possui permissão de leitura para o usuário atual.
- -s Verifica se o arquivo existe e não está vazio.
- -w Verifica se o arquivo existe e se possui permissão de escrita.
- -x Verifica se o arquivo existe e possui permissão de execução.
- -O Verifica se o arquivo existe e se é de propriedade do usuário atual.
- -G Verifica se o arquivo existe e seu grupo padrão é o mesmo do usuário atual.
- -L ou -h Verifica se o arquivo existe e se é um link simbólico.
- arq1 -nt arq2 Verifica se arq1 é mais novo que arq2.
- arq1-ot arq2 Verifica se arq1 é mais antigo que arq2.
case
O comando case é parecido com o for pois ele lida com comparações. Mas o comando for lida com isso de forma muito mais complexa. Veja abaixo a sintaxe desse comando:
#!/bin/bash
# Recebemos o valor de valor_para_teste
# E realizamos diversos testes com o valor
echo -n "Informe o valor que você deseja testar: "
read valor_para_teste
case $valor_para_teste in
1)
echo "O valor é igual a 1"
;;
2|3|4)
#Apenas se os valores forem 2, 3 e 4
echo "O valor é igual a 2, 3 ou 4"
break # não sei a utilização desse break!
;;
*)
# para todas as outras opções como se fosse um else
echo "Não tem mais nada a ver com os meus testes"
esac
for
O Comando for é utilizado para interar em uma lista de elementos. Exemplo abaixo vamos realizar um loop por todos os parametros passados para o script for.sh. A variável $@ é uma lista contendo todos os parametros passados para o script
#!/bin/bash
# para que esse script funcione é preciso passar diversos parametros para o mesmo
# Dessa forma:
# bash for.sh banana maça abacate
for parametro in $@
do
echo $parametro
done
bash for.sh banana abacate melancia
banana
abacate
melancia
while
Assim como o comando for o comando while realializa loops. E ele funciona da seguinte forma.
until
Descrever o comando until
case
Descrever o comando case
read
Descrever o comando read
seq
Descrever o comando seq
shift
This command takes one argument, a number. The positional parameters are shifted to the left by this number, N. The positional parameters from N+1 to $# are renamed to variable names from $1 to $# - N+1.
Termos e Utilitários
- if
- test
- for
- while
- read
- seq
- exec