Capítulo 05: Comandos de Loop ←
Funções
Funções são interessantes para quando você precisa fazer uma determinada coisa várias vezes num mesmo script.
Uma função é como se fosse um script dentro do script, sendo assim ele
também usa o mesmo esquema de parâmetros de um script comum ($1
para
primeiro parâmetro, $2
para segunda, e todas aquelas regras explicadas em
Parâmetros com a exceção do $0
, que não retorna o nome da função!).
Uma função também é capaz de retornar um valor usando o
return ValorDeRetorno
, sendo que ValorDeRetorno ficará armazenado em
$?
, vale observar também que só é possível retornar valores inteiros.
Por exemplo, se na função tiver return 123
depois da execução desta
instrução $?
valerá 123.
Bem... explicar com um código sempre é mais fácil! Se você acha que vai se safar do poderoso "Hello World" está muito enganado! Aí vai ele:
#!/bin/bash
# hello.sh
# "Hello World" usado para ilustrar o uso de funções.
function quit {
echo -e "\e[1;32mTCHAU!\e[m"
exit
}
function e {
echo -e "\e[1;35m$1\e[m"
}
e Hello
e World
quit
echo "Isso aqui não será impresso"
Uhmmm... Sem falar muito eu já emendo outro código:
#!/bin/bash
# maior.sh
PARAM_ERR=-198 # Se for passado mais do que dois parâmetros.
EQUAL=-199 # Retorno se os parâmetros forem iguais.
function maior # Retorna o maior de dois números
{ # OBS: os números comparados precisam ser menores que 257
[ -z "$2" ] && return $PARAM_ERR
if [ "$1" -eq "$2" ]; then
return $EQUAL
elif [ "$1" -gt "$2" ]; then
return $1
else
return $2
fi
}
read -p "Numero-1: " N1
read -p "Numero-2: " N2
maior $N1 $N2
RET_VAL=$?
if [ $RET_VAL -eq $PARAM_ERR ]; then
echo "É necessário passar dois parâmetros para a função."
elif [ $RET_VAL -eq $EQUAL ]; then
echo "Os dois números são iguais."
else
echo "O maior número é $RET_VAL."
fi
exit 0
Só mais algumas informações adicionais:
- O return quando executado interrompe a execução da função e a execução passa para a instrução imediatamente posterior a qual a função foi chamada.
- O valor mais alto que uma função pode retornar é 256.
- Se quer saber mais detalhes sobre funções o Functions do Advanced Bash-Scripting Guide vai lhe ser muito útil (ver Referências).
Fique com mais este código que eu achei bem interessante. ;-)
#!/bin/bash
# romano.sh
#
# Código baseado em um do Advanced Bash-Scripting Guide.
# Mais informações sobre este guia em http://www.linuxdoc.org
# Caso não entenda o código, faça um esforcinho! ;-)
LIMITE=400
function romano {
NUM=$1
FATOR=$2
ROMAN=$3
(( RESTO = $NUM - $FATOR ))
while [ "$RESTO" -ge 0 ]; do
echo -n $ROMAN
(( NUM -= $FATOR ))
(( RESTO = $NUM - $FATOR ))
done
return $NUM
}
[ "$1" ] || {
echo "Uso: `basename $0` NUMERO"
exit 1
}
[ "$1" -gt 400 ] && {
echo "$1 ultrapassa o limite de $LIMITE"
exit 1
}
NUMERO=$1
romano $NUMERO 100 C
NUMERO=$?
romano $NUMERO 90 XC
NUMERO=$?
romano $NUMERO 50 L
NUMERO=$?
romano $NUMERO 40 XL
NUMERO=$?
romano $NUMERO 10 X
NUMERO=$?
romano $NUMERO 9 IX
NUMERO=$?
romano $NUMERO 5 V
NUMERO=$?
romano $NUMERO 4 IV
NUMERO=$?
romano $NUMERO 1 I
NUMERO=$?
echo
exit
Ah! Deixa eu dizer só mais uma coisinha: é possível declarar função(ões) dentro de função. Desta vez não darei exemplos, faça os testes por conta própria! :-)
Capítulo 07: Tornando seu script amigável →