Funções no bash



Funções no bash são uma verdadeira mão na roda, vc pode automatizar uma porção de comandos longos e repetitivos. O Aurélio (verde) e o Tobias (http://thobias.org/) criaram uma biblioteca de funções úteis como consultar cotação de moedas, pronuncia de palavras em inglês etc…Seu nome é .
Criar uma função no bash é muito simples, abra seu editor favorito e digite :


function digaoi()
{
echo 'filma eu galvão !!!';
}

Para carregar sua função no shell atual digite :


source arquivo.func

Onde arquivo.func é o nome do arquivo onde vc digitou os comandos 🙂
Pode conferir, agora no seu shell existe o comando digaoi, experimente executa-lo. Como vc percebeu ele imprime na tela a frase “filma eu galvão!!!”

Agora vamos tentar um comandinho mais útil, eu particularmente adoro animes, e muitas vezes estes vem encodados com codecs pesados demais para máquinas humildes então frequentemente eu converto um vídeo ou outro para um formato mais leve. Resumidamente (a original é 3 vezes maior ) a linha de comando que eu uso é :


mencoder -o arquivosaida.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 arquivodeentrada.mkv

E teve um dia que eu me embananei e sobescrevi o arquivo original, tive que baixar o desenho de novo ….. Pra evitar problemas criei a seguinte função :


function ..pramaquinavelha () {
mencoder -o $1.avi -oac mp3lame -ovc lavc -lavcopts bitrate=2000 $1
}

O nome da função é “..pramaquinavelha”, ela chama o mencoder com os parametros que eu quero, por exemplo:


..pramaquinavelha ghost-in-the-shell-01.mkv

E como saída ele gera o arquivo “ghost-in-the-shell-01.mkv.avi”.
Como vc observou, eu passei um parâmetro para a função, para isso basta usar a variável $1, seu valor é a primeira string passada logo após o comando principal, no meu caso, o nome do arquivo que eu queria converter, ghost-in-the-shell-01.mkv.
“Mas porquê $1 ?Não poderia ser outro número ?” você pergunta. Sim ! Os números vão de 0 até infinito (nem tanto), vc pode passar multiplos parâmetros para uma função, como por exemplo o bitrate do vídeo além do nome do arquivo.A variável $0 é o próprio comando, e os parâmetros são numerados de $1 até $N, exemplo:


comando parametro1 parametro2 ... parametroN
$0 $1 $2 $N

Um outro tipo de função que eu uso bastante é um script que lista as dependêncas de um binário e quais pacotes suprem essas depências, segue a listagem :


..showdeps (){
[ "$1" ] || { echo 'uso: ..showdeps arquivo_binário'; return; }
rpm -qf `ldd $1 | awk '{print$3}'` | sort | uniq
}

Nesse exemplo alé da variável de argumento ($1), também fiz uso do comando de testes “[” e “]” e de um operador lógico “ou” (“||”). As chaves testam se algum parâmetro foi passado e caso positivo prossegue com a função, se não imprime uma mensagem ensinando ao usuário como usar a dita função. O resto da função é pauta para outro post, o que vale dessa vez é a idéia, funções são poderosas, implemente as suas, e divida com os amigos 🙂

Para ter suas funções favoritas sempre carregadas no shell, adciona a linha “source arquivo.func” à configuração do seu shell, por exemplo ~/.bashrc.

Depois falo mais de shell e seus truques.