Sei sulla pagina 1di 3

S

: Programação Shell Script

Postado por unistd


Contribuição de unistd emTuesday, April 30 @ 02:32:34 BRT

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...

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.

h
S

11-15) Verifica se a resposta dada é igual a "s" ou "S", se for, executa o comando rm -rf para apagar todos os arquivos
Procura 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?

h
S

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"

Potrebbero piacerti anche