| Estrutura geral de um Script Shell |
|
|
|
| Escrito por Prof. Carlos A. Maziero |
| Ter, 25 de Janeiro de 2011 01:26 |
|
Os arquivos de script permitem construir esquemas de execução complexos a partir dos comandos básicos do shell. A forma mais elementar de arquivo de script é apenas um conjunto de comandos em um arquivo texto, com permissões de execução habilitadas. O arquivo backup, cujo conteúdo é mostrado a seguir, é um exemplo de script: echo "Iniciando backup..." Quando o script backup for executado, os comandos do arquivo serão executados em seqüência pelo shell corrente (de onde ele foi lançado). Assim, se o usuário estiver usando o shell bash, os comandos do script serão executados por esse shell. Como isso poderia gerar problemas em scripts usados por vários usuários, é possível forçar a execução do script com um shell específico (ou outro programa que interprete os comandos do arquivo). Para isso é necessário informar ao sistema operacional o programa a ser usado, na primeira linha do arquivo do script: #!/bin/bash --noprofile Com isso, será lançado um shell Bash separado (um novo processo), somente para interpretar as instruções do script. O novo processo será terminado pelo comando exit, cujo parâmetro é devolvido ao shell anterior através da variável $?. Esse procedimento pode ser usado para lançar scripts para outros shells, ou mesmo outras linguagens interpretadas, como Perl, Awk, Sed, Php, Python, etc. Parâmetros de entrada #!/bin/bash Chamando o script acima com alguns parâmetros se obtém a seguinte resposta: ~> listaparams banana tomate pessego melao pera uva Controle de fluxo
Condições
if cmp $file1 $file2 >/dev/null # testa o status do comando cmp Essa lógica “ao contrário” pode causar uma certa confusão aos iniciantes. Assim, para simplificar a programação de scripts, é definido um operador test condition, que também pode ser representado por [ condition ] e retorna zero (0) se a condição testada for verdadeira: if [ $n1 -lt $n2 ] # $n1 é menor que $n2? Os principais operadores de teste disponíveis são: if comando Os principais tipos de teste disponíveis são: Comparações entre números -eq : igual a -ne : diferente de -gt : maior que -ge : maior ou igual a -lt : menor que -le : menor ou igual a -a : AND binário (bit a bit) -o : OR binário (bit a bit) Comparações entre strings usando [] = : igual a != : diferente de -z : string de tamanho zero Comparações entre strings usando [[]] ? : menor ou igual a (lexicográfico) >= : maior ou igual a (lexicográfico) Associações entre condições && : AND lógico || : OR lógico Os operadores de teste em arquivos permitem verificar propriedades de entradas no sistema de arquivos. Eles são usados na forma -op, onde op corresponde ao teste desejado. Os principais testes são: e : a entrada existe r : a entrada pode ser lida w : a entrada pode ser escrita O : o usuário é o proprietário da entrada s : tem tamanho maior que zero f : é um arquivo normal d : é um diretório L : é um link simbólico b : é um dispositivo orientado a bloco c : é um dispositivo orientado a caracatere p : é um named pipe (fifo) S : é um socket special file u : tem o bit SUID habilitado g : tem o bit SGID habilitado G : grupo da entrada é o mesmo do proprietário k : o stick bit está habilitado x : a entrada pode ser executada nt : Verifica se um arquivo é mais novo que outro ot : Verifica se um arquivo é mais velho que outro ef : Verifica se é o mesmo arquivo (link) Eis um exemplo de uso de testes em arquivos: arquivo='/etc/passwd' if [ -e $arquivo ] Além das estruturas acima, algumas outras podem ser usadas para executar comandos em situações específicas: `comando` : substitui a expressão entre crases pelo resultado (stdout) da execução do comando. Por exemplo, a linha de comando abaixo coloca na variável arqs os nomes de arquivos retornados pelo comando find: arqs=`find /etc -type f -iname '???'` comando1; comando2; comando3 : executa seqüencialmente os comandos indicados Operadores aritméticos Variáveis contendo números inteiros podem ser usadas em expressões aritméticas e lógicas. A atribuição do resultado de uma expressão aritmética a uma variável pode ser feita de diversas formas. Por exemplo, as três expressões a seguir têm o mesmo efeito: i=$((j + k)) let i=j+k i=`expr $j + $k` Os principais operadores aritméticos disponíveis são: + - * / : aritmética básica ** : potenciação % : módulo (resto) += -= *= /= %= : aritmética e atribuição (como em C) « » : deslocamento de bits «= »= : deslocamento e atribuição & | : AND e OR binários &= |= : AND e OR binários com atribuição ! : NOT binário ^ : XOR binário && || : AND e OR lógicos Exercícios Analise e descreva o que faz o script abaixo, passo a passo. Em seguida, copie-o no arquivo meuscript, em sua área de trabalho, e teste-o. #!/bin/bash --noprofile Escreva um script chamado clean para limpar seu diretório $HOME, removendo todos os arquivos com extensão bak ou ~ que não tenham sido acessados há pelo menos 3 dias. Dica: use os comandos find e rm e a avaliação por aspas inversas. Escreva um script para criar diretórios com nome DirXXX, onde XXX varia de 001 a 299. Dica: use o comando printf para gerar o nome dos diretórios a criar. Escreva um conjunto de scripts para gerenciar o apagamento de arquivos. O script del deve mover os arquivos passados como parâmetros para um diretório lixeira; o script undel deve mover arquivos da lixeira para o diretório corrente e o script lsdel deve listar o conteúdo da lixeira. O diretório lixeira deve ser definido através da variável de ambiente $LIXEIRA. Funda os scripts do exercício anterior em um só script del, com os demais (undel e lsdel) sendo links simbólicos para o primeiro. Como fazer para que o script saiba qual a operação desejada quando ele for chamado, sem precisar informá-lo via parâmetros? Escreva um script para verificar quais hosts de uma determinada rede IP estão ativos. Para testar se um host está ativo, use o comando ping. A rede deve ser informada via linha de comando, no formato x.y.z, e o resultado deve ser enviado para um arquivo com o nome x.y.z.log. Deve ser testada a acessibilidade dos hosts de x.y.z.1 a x.y.z.254. |
| Última atualização em Ter, 25 de Janeiro de 2011 01:47 |


