Assim como outras linguagens de programação, o shell script possui estruturas de controle do tipo:
if,
case,
while e
for.
A sintaxe dessas estruturas é a seguinte:
if:
#!/bin/bash
nome="paulo";
if [ $nome != "paulo" ] ; then
echo "vc não é o paulo!";
fi
case:
#!/bin/bash
i=1;
case $i in
1)
echo "é 1";
;;
2)
echo "é 2";
;;
*)
echo "não 1 nem 2";
;;
esac
while:
#!/bin/bash
i=1;
while [ $i -le 10 ] ; do
echo $i;
i=$(( $i + 1 ));
done
for:
#!/bin/bash
for i in $( seq 10 ) ; do
echo $i;
done
Shell script tem algumas características que não são comuns em outras linguagens. Por exemplo, os espaçamentos que normalmente são permitidos em outras linguagens, podem causar erros em shell script.
Quando é criada uma variável, não deve haver espaços entre o nome da variável, o sinal de igual e o valor atribuído:
#!/bin/bash
i=1; # ok, vai funcionar
j = 2; # acho que não vai funcionar
Observações:
- Perceba que ao criar a variável, não usei o "$". Este símbolo é usado apenas para recuperar o valor da variável.
- O que está após o símbolo "#" é considerado comentário e não é executado.
- É possível utilizar o comando read para ler da entrada padrão (geralmente o teclado) e criar variáveis especificadas pelo usuário em tempo de execução.
Veja mais sobre isso no artigo:
Explorando a entrada de dados com READ em Bash Shell
Outra particularidade do shell script, é que operações matemáticas não são realizadas diretamente, é necessário utilizar algum comando para realizar o cálculo, por exemplo:
#!/bin/bash
i=1;
j=$(( $i + 1 )); # ok
j=$( expr $i + 2 ); # ok
j=$i + 1; # não vai funcionar como esperado
No exemplo acima, utilizei o comando:
( $i + 2 )
Basicamente, trata-se de um subshell, o que estiver dentro de "$( )" é executado à parte e o resultado (o que seria impresso na saída padrão) é atribuído para variável. Também seria possível utilizar o comando
expr $i + 2 para ter o mesmo resultado.
Outro detalhe importante que foi visto nos exemplos anteriores, são os operadores usados nas estruturas de controle dentro do comando "[ ]", que na verdade é um açúcar sintático para o comando
test
Veja alguns desses operadores
Para números:
- lt → É menor que (LessThan)
- gt → É maior que (GreaterThan)
- le → É menor ou igual (LessEqual)
- ge → É maior ou igual (GreaterEqual)
- eq → É igual (EQual)
- ne → É diferente (NotEqual)
Para strings:
- = → É igual
- != → É diferente
Testes lógicos:
- ! → Negação
- -a → and (geralmente &&)
- -o → or (geralmente ||)