O primeiro deles eu não sei o nome, mas acho que posso chamar de "declaração condicional de funções". O nome pode parecer chato, mas darei um exemplo para vocês entenderem.
Imaginem que você tem um script, digo, programa, que é capaz de se apresentar para o usuário usando diferentes interfaces.
O que eu quero exatamente. Um programa que execute as seguintes ações:
LerDadosDoUsuario Idade "Digite sua idade"
if ((Idade>=18))
then
Escreva "Você é Maior de Idade. Pode passar"
else
Escreva "Você é menor de idade. Sai pra lá, pivete"
fi
A questão é: no lugar da chamada "LerDadosDoUsuario" eu poderia ter dado um 'echo "Digite sua idade"; read Idade', por exemplo. Mas o questão aqui é sermos o mais flexíveis possível, não é? Afinal, se quiséssemos que este programa fosse apresentado numa interface mais amigável, como em dialog ou Xdialog, teríamos que que modificar o código todo!
Para resolver isso, podemos fazer o seguinte: precisaremos primeiramente de um flag. Uma variável que nos diga se deveremos usar uma interface em dialog ou em modo texto mesmo.
Ela pode ter o valor "true", se vai usar dialog, ou "false", se será na base do echo mesmo.
if $USEDIALOG # flag
then
function LerDadosDoUsuario()
{
DadoLocal=$(dialog --inputbox "$2" 0 0 --stdout)
eval $1=\"$DadoLocal\"
}
function Escreva()
{
dialog --infobox "$1" 0 0
}
else
function LerDadosDoUsuario()
{
echo "$2"
read DadoLocal
eval $1=\"$DadoLocal\"
}
function Escreva()
{
echo $1
}
fi
Desta forma, você poderia utilizar as funções Escreva e LerDadosDoUsuario quantas vezes quisesse no programa e, para modificar a interface do programa todo, bastaria modificar algumas poucas linhas!
É claro que muitas vezes não é conveniente que todo esse código fique no mesmo arquivo que o núcleo do programa. Você poderia deixar as funções de cada interface em arquivos diferentes, como no exemplo:
if $USEDIALOG
then
source interfaces/dialog.sh
else
source interfaces/cli.sh
fi
Neste caso, as funções referentes à interface em dialog ficariam no arquivo "source interfaces/dialog.sh" e as em modo texto ficariam em "interfaces/cli.sh".