Shell script também tem funções, elas seguem a seguinte sintaxe:
#!/bin/bash
function somar() {
echo $(( $1 + $2 ));
}
somar 3 5 # esses são os parâmetros recuperados por $1 e $2
As funções em shell script são chamadas da mesma forma que um comando, elas recebem parâmetros sem a necessidade de especificá-los na declaração da função.
Os parâmetros são recuperados através de variáveis especais, como a "$1" e a "$2" utilizadas no exemplo acima. Segue uma lista de outras variáveis utilizadas em funções:
- $0 → O nome da função
- $1 → O primeiro parâmetro
- $2 → O segundo parâmetro
- $numero → O parâmetro da posição numero
- $# → A quantidade de parâmetros
- $* → Todos os parâmetros
Com essas variáveis, posso melhorar o script anterior de forma a não limitar o número de parâmetros a serem somados:
#!/bin/bash
function somar() {
resultado=0;
for i in $* ; do
resultado=$(( $resultado + $i ));
done
echo $resultado;
}
somar 1 2 3 4 5
Uma observação importante sobre as funções em shell script, é que apesar de possuir a instrução "return", essa instrução é utilizada para uma finalidade diferente do que as demais linguagens.
Em shell script, funções são chamadas como os comandos, e como os comandos, elas têm um código de retorno que indica se as instruções foram executadas corretamente ou não. Este código é retornado com a instrução "return" :).
Ou seja, o return vai especificar se a função foi ou não bem sucedida.
Obs.: Pode ser testado com a variável "$?", tente executar um comando no terminal e depois rode o comando "echo $?".
Para conseguir armazenar o retorno de função em uma variável, como seria feito em outras linguagens, costumo usar o subshell dessa maneira:
#!/bin/bash
function somar() {
resultado=0;
for i in $* ; do
resultado=$(( $resultado + $i ));
done
echo $resultado;
}
#usando o subshell é possível
#armazenar o retorno da função
total=$( somar 1 2 3 4 5 );
A grande utilidade das funções, é que elas organizam e garantem a reutilização de código. Uma possibilidade interessante que o shell script permite, é incluir um arquivo com funções dentro de outro (parecido com o
require e
include do PHP).
Por exemplo, posso criar varias funções que estejam relacionadas e colocá-las no mesmo arquivo e depois, quando for necessário, uso a instrução "source" para incluir essas funções em outro arquivo.
Supondo que a função "somar" estivesse no arquivo "matemática.sh", posso usá-la em outro arquivo da seguinte maneira:
#!/bin/bash
source "matematica.sh";
total=$( somar 1 2 3 4 5 );