Shell Script - Usando vários scripts em um só

Publicado por Perfil removido em 17/04/2013

[ Hits: 7.479 ]

 


Shell Script - Usando vários scripts em um só



A dica é a seguinte:

Em scripts para bash, existe um conjunto de variáveis especiais que repassam ao script parâmetros da linha de comando.

Em C, isso aparece sob a forma de "int main(int argc, char *argv)".
Nos scripts, a variável que carrega todos os parâmetros sob forma de vetor é $@. O número de parâmetros é indicado com $#.

Cada parâmetro pode ser identificado pelo sinal de $ seguido de um numeral. O primeiro parâmetro enviado pelo prompt é o nome do script, que é $0.

Os outros serão $1, $2, $3 ... No caso, será abordada uma das utilidades do $0.

Seja então o script abaixo, chamado de "meuscript.sh":

#!/bin/bash

echo -n "$0 ";

[[ "$0" == "./cria.sh" ]] && echo "criando...";
[[ "$0" == "./modifica.sh" ]] && echo "modificando...";
[[ "$0" == "./elimina.sh" ]] && echo "eliminando..."
[[ "$0" == "./pesquisa.sh" ]] && echo "pesquisando...";


Com permissão de execução e criados os seguintes links no mesmo diretório:

chmod +x meuscript.sh
$ ln -s meuscript.sh cria.sh
$ ln -s meuscript.sh elimina.sh
$ ln -s meuscript.sh modifica.sh
$ ln -s meuscript.sh pesquisa.sh


Sendo executados no mesmo diretório, o que será enviado através da variável $0, não será o nome do script (meuscript.sh) e sim o nome do link chamado.

Assim, se for pedida a execução da seguinte linha:

./modifica.sh

Aparecerá a seguinte mensagem:
./modifica.sh modificando...

Desta forma, pode ser criado um link com determinado nome a ser decidido pelo script qual função ele fará. Esta abordagem permite o uso das mesmas funções (sub-rotinas) do script juntas, dentro do mesmo arquivo.

Nota: a linha:

[[ "$0" == "./modifica.sh" ]] && echo "modificando...";


Pode ser substituída por:

if [ "$0" == "./modifica.sh" ]];
then
       echo "modificando...";
fi;


Sem problema algum. Vai de cada um.

Outras dicas deste autor

Instalando libdvdcss sem suporte no seu Linux

Como mudar o tema no Gimp

Desabilitando modo "offline" no Firefox 3.x

Utilizar o Monodevelop via proxy

Configurando o proxy como variável de ambiente

Leitura recomendada

Integrando agenda do jSMS do Linux e do Windows

Atualizar Panda antivírus para Linux via script

Debug em Shell Scripts

Lendo registros formatados de arquivo de texto em bash

HD externo em EXT4 com a praticidade da NTFS - FUSB

  

Comentários
[1] Comentário enviado por julio_hoffimann em 17/04/2013 - 08:04h

Abordagem interessante, mas scripts não devem depender do próprio nome por vários motivos.

Exemplo:

$ bash ./cria.sh
$ ./cria.sh && ./modifica./sh

Boa dica,
Abs.

[2] Comentário enviado por removido em 17/04/2013 - 08:38h

Obrigado por lembrar e comentar esse detalhe.
Se eu perceber que a ideia do && pode funcionar de alguma outra forma, eu comentarei.

[3] Comentário enviado por removido em 17/04/2013 - 19:51h

Sobre um modo de o && funcionar.

Muitas vezes só se tem dois minutos prá resolver algum problema. Não há como perder tempo com depuração.
Scripts costumam ter essa utilidade. Neste exemplo, o script não cobriu uma destas falhas.

Um dos problemas adicionais envolveria o caminho onde o script se encontraria em caso de execução.
Sendo um diretório local, $0 equivale a ./nome_executado.
Se estivesse em /usr/local/bin/nome_executado, $0 teria exatamente o valor dessa string.

Este exemplo direcionou-se apenas no nome usado na execução.
Esta ideia depende de como é aplicada. Se pode ser posta em prática ou se é viável.
O que envolveria "detalhes de projeto".

O exemplo
$ ./cria.sh && ./modifica./sh

não funciona como deveria, mas
$ ./cria.sh || ./modifica./sh

executa os dois comandos.

Mas se no final do script for colocado uma dessas instruções

true

exit 0

Então a sequência

$ ./cria.sh && ./modifica./sh

passa a ser executada.

[4] Comentário enviado por julio_hoffimann em 17/04/2013 - 20:08h

Toda solução é possível, resta saber se é prática e manutenível. Você deve se espelhar nos aplicativos GNU, eles não utilizam o artifício proposto para prover diversas funcionalidades.

A solução correta quando se deseja diversas operações em um mesmo script é utilizar o getopt ou o builtin do Bash getopts para opções na linha de comando.

[1] http://blog.onetechnical.com/2012/07/16/bash-getopt-versus-getopts/
[2] http://linuxwell.com/2011/07/14/getopt-in-bash/

[5] Comentário enviado por removido em 17/04/2013 - 20:45h

Concordo com o que for simples, melhor e mais prático. Agradeço pelos links.
Inclusive também há bons exemplos do getopt em /lib/lsb/init-functions

Muita coisa que aprendi sobre shell foi sem uma orientação desse sentido mais prático, de manutenção mais simples.
Tratando como simples programação comum, mais concisa. Original, mas nem sempre muito prático.
Eu necessitaria direcionar prá esse lado do que shellscript verdadeiramente e realmente se presta a ser útil.

Por exemplo, dá prá fazer um BD em shell e teve um cara que projetou um Assembler em shell.
(Existe até um servidor web em AWK).
Vejo todos estes mais como exercícios de desenvoltura. Teóricos e complexos, mas de grande valor de aprendizado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts