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