Programação Shell Script (1826 total de palavras neste texto) (42 lido) Programação Shell Script A facilidade na criação destes scripts é um ponto forte que faz com que muitas pessoas optem por este tipo de linguagem sempre que possível, pois estes possuem algumas limitações. A seguir um exemplo de shell script bem simples: 1 #!/bin/sh 2 # Shell script para adicionar uma linha com conteudo definido 3 # pelo usuario a um arquivo 4 echo -e "Inserir:" 'c' 5 read inserir 6 echo $inserir >> $1 A seguir a explicação de cada linha: 1) Essa linha especifica ao shell qual interpretador deve ser usado para a execução do programa, como este é um shell script o interpretador usado é o sh, contido no diretório "/bin". 2-3) Apenas comentários(para comentar linhas preceda-as por "#") 4) O comando "echo" é utilizado para exibir um prompt ao usuário para que ele digite o que dejesa inserir no arquivo. 5) Define que aquilo que o usuário digitou no prompt será chamado pela string $inserir; 6) Finalmente, utiliza o comando "echo" para enviar o que o usuário digitou para a última linha do arquivo que foi especificado no primeiro argumento do comando("$1"). Simples, não?! Agora vamos a algumas dúvidas que podem ter surgido: P: Por que foram utilizados os argumentos "-e" e "'c'" no comando "echo"? R: O argumento "-e" habilita a interpretação de argumentos como o "'c'" que por sua vez é utilizado para que crie-se um prompt na posição em que ele estiver. P: Pra que serve esse ">>"? R: Serve para aquilo que seria exibido na saída default seja inserido em um determinado arquivo sem destruir o conteúdo do mesmo. Caso fosse um ">" solitário o conteúdo do arquivo seria destruído e ele passaria a ter apenas o que foi fornecido por nós. Esse tipo de função chama-se "append". Bem, eu acho que agora você já está pronto para scripts um pouco mais complexos. O seguinte script procura por arquivos pertencentes a um determinado usuário, lista-os e, caso haja a confirmação, apaga-os. 1 #!/bin/sh 2 # Apaga arquivos de um determinado usuário caso você seja root. 3 if [ "$LOGNAME" = "root" ]; then 4 if [ "$#" != 1 ]; then 5 echo "Uso: `basename $0` " 6 exit 0 7 fi 8 echo -e "Remover os arquivos de $1 [s/N]" 'c' 9 read resposta 10 if [ $resposta ]; then 11 if [ "$resposta" = s -o $resposta = S ]; then 12 rm -rf `find / -user $1 | grep -v "/dev/tty"` 13 else 14 exit 0 15 fi 16 else 17 exit 0 18 fi 19 else 20 echo "Erro: Voce precisa ser root para rodar este programa" 21 fi Agora a explicação de cada linha: 1-2) Essas você conhece. 3) Utiliza o comando "if" para verificar se o usuário é root. 4-7) Verifica se o número de argumentos fornecidos na linha de comando é diferente de 1, caso haja confirmação é exibida mensagem de erro e o programa é finalizado. 8-9) Exibe o prompt de confirmação(echo...) e nomeia a resposta dada como a string $resposta(read resposta). 10) Verifica se foi dada alguma resposta. 11-15) Verifica se a resposta dada é igual a "s" ou "S", se for, executa o comando rm -rf para apagar todos os arquivos pertencentes usuário especificado no argumento 1("$1") utilizando o comando "find / -user $1| grep -v /dev/tty" para lista-los. NOTA: O comando "grep" é utilizado para excluir da lista os arquivos /dev/ttyX, como /dev/ ttyS1, que recebem o uid do usuário ao serem abertas sessões e cuja exclusão poderia prejudicar o funcionamento do sistema. 16-18) Caso o usuário não tenha dado uma resposta no prompt, o programa é finalizado. 19-21) Caso você nao seja root é apresentada uma mensagem de erro e o programa é finalizado. Agora vamos às perguntas que provavelmente tenham surgido: P: Como esse comando "if" é utilizado? R: Simples. if [ expressão de teste ]; then comando em caso de positivo else comando em caso de negativo fi NOTA: Expressões de teste serão explicadas a seguir. P: O que é "$LOGNAME"? R: É uma variável do ambiente shell. Utilize o comando "env" para conhecer as variáveis que o seu shell possui. Agora falaremos de expressões de teste, que são utilizadas para comparações de strings. As expressões de teste não são utilizadas somente com o comando "if", podem ser utilizadas também com o comando "while" que será explicado mais adiante. A seguir as expressões com suas respectivas funções. Expressões de teste inteiras: Expressão Torna-se verdadeira se: x -gt y x for maior que y x -ge y x for maior ou igual a y x -lt y x for menor que y x -le y x for menor ou igual a y x -eq y x for igual a y x -ne y x não for igual a y Expressões de strings: Expressão Torna-se verdadeira se: string string foi inicializado -n string string é diferente de zero -z string string é igual a zero string1 = string2 string1 é igual a $string2 string1 != string2 string1 não é igual a string2 Expressões de testes para arquivos: Expressão Torna-se verdadeira se: -e file file existe(também pode ser usado -f) -r file file é legível -w file file é gravável -x file file é executável -d file file é um diretório file1 -nt file2 file1 é mais novo que file2 file1 -ot file2 file1 é mais velho que file2 Expressões de testes booleanas(AND, OR e NOT): Expressão Função: exp1 -a exp2 Torna-se verdadeira se ambas as expressões forem verdadeiras. exp1 -o exp2 Torna-se verdadeira se uma das expressões for verdadeira. !exp Torna a avaliação em verdadeira, se for falsa e em falsa se for verdadeira.(ex: if ! [ -d diretório ] funcionará como "Se o diretorio não existir".) Bem, agora que você já conhece as expressões de testes iremos explicar como gerer "loops" com os comandos "for" e "while". O comando "for" é utilizado para que uma tarefa seja executada sobre diversos itens especificados. O while é utilizado para que uma tarefa seja executada até que a expressão de teste especificada torne-se falsa. Exemplos: 1 #!/bin/bash 2 # xvslide - exibe todas as imagens de um diretorio seguidamente 3 # como "slides". 4 echo -e "Tempo de espera entre as imagens(seg):"'c'; read tempo 5 for img in `ls` 6 do 7 xv $img & 8 sleep $tempo 9 killall xv 10 done Este script é muito simples: 1-3) Precisa repitir? 4) Exibe o prompt para que o usuário informe o tempo de espera entra as imagens e identifica a resposta como $tempo.(";" separa comandos) 5) Inicia o comando "for" identificando a próxima imagem apresentada no comando "ls" como $img. 6) do = fazer 7) roda o comando "xv" para visualizar a imagem identificada por $img. Note que o comando está detachado("&") para que o script possa seguir após sua execução. 8) Utiliza o comando "sleep" para esperar o número de segundos indicados pela variável $tempo. 9) Mata o processo correspondente ao "xv" 10) done = feito! Agora um exemplo de while: 1 # Contagem Regressiva - Regressiva.sh 2 #!/bin/sh 3 contagem="$1" 4 while [ $contagem != 0 ] 5 do 6 echo $contagem 7 sleep 1 8 contagem=`expr $contagem - 1` 9 done Explicação: 1-2) Você pode me dizer. 3) Identifica o número indicado no primeiro argumento("$1") como $contagem. 4) "Enquando $contagem for diferente de 0..." 5) "faça" 6) "mostrar contagem" 7) "durma durante um segundo" 8) "Subtraia 1 de $contagem" 9) "feito!" Depois desses dois exemplos foi possível constatar como funcionam os comandos "for" e "while". for - "for variavel_correspondente_ao_item_atual in Comando que gera a lista do comando done" while - "while expressao de teste do comando done" Fonte: www.slacklife.com.b