4 Programação em shell
Matthew & Stones cap 2
Taisy Weber • pipe,
• redirecionamento de entrada e de saída,
• comandos,
• variáveis, estruturas de controle e condicionais
• criação de scripts
TSW 2
1
Comandos UNIX Resumo de alguns comandos
não tenha medo de experimentar!
revisar
– se você não possui domínio dos comandos
cat: lê e mostra arquivos em stout, se não aparece arquivo então stin,
básicos UNIX, está na hora de: permite concatenação
– explorar os comandos UNIX (Linux)
grep: pesquisa em um ou mais arquivos por linhas que casam com uma
– estabelecer uma relação entre os comandos básicos e o expressão regular dada ( -l: listar)
MS-DOS
– familiarizar-se com os conceitos elementares de operação ls: lista conteúdo de um diretório dado, se nenhum é dado lista o atual
de ambientes UNIX more: display o conteúdo do arquivo, uma tela de cada vez
– aprender a usar redirecionamento e pipes
chmod: altera as permissões de acesso de um arquivo
• exercite-os listando arquivos diretórios, verificando
o estado de processos ... touch : verifica se existe arquivo, senão cria
use man rm : remove arquivo use man
lab lab
TSW 7 TSW 8
TSW 9 TSW 10
2
Redirecionamento operador 2>
da saída de erro
– usar > com o número do descritor de arquivo – 2> exemplo : arquivo rel.txt não existe
• operador 2>
$ cat rel.txt >novorel.txt
• útil para descartar informação de erro, evitando que cat: rel.txt: No such file or diretory
apareça na tela
redirecionamento de stout mens. erro
• exemplo: vai para $ cat rel.txt >novorel.txt 2>erros.log
$ kill -HUP 1234 > killout.txt 2>killerr.txt erros.log $ cat erros.log
cat: rel.txt: No such file or diretory
redirecionamento de saída de erro
Matando um processo de um script: existe o risco do $ cat rel.txt >novorel.txt 2>/dev/null
processo já estar morto. Redirecionar as mensagens de
erro evita que elas apareçam na tela. balde furado universal: /dev/null
lab
TSW 13 TSW 14
– {string} agrupa strings que serão expandidos pela Shell forma 2– armazenando os comandos em um arquivo e
exemplo: invocando da mesma forma que um programa
$ ls my_{finger,toe}s $ ls my_fingers – usando um editor de textos comum
scripts
$ ls my_toes
TSW 17 TSW 18
3
Exemplo de programa interativo Programa interativo x script
primeira forma
– determinar todos os arquivos que contém o 4 programa interativo
string POSIX – desvantagem primeira forma
arquivo é uma variável e
$ for arquivo in * $arquivo seu conteúdo • digitar o programa cada vez que for necessário
> do
> if grep -l POSIX $arquivo • inibe reuso
> then
> more $arquivo
4 shell script segunda forma
> fi • armazenar programa em um arquivo
> done grep e more são comandos
• invocar o arquivo
grep: pesquisa em um ou mais arquivos por linhas que
casam com uma expressão regular dada ( -l: listar)
– vantagem
more: mostra o conteúdo do arquivo, uma tela de cada vez
• scripts possibilitam reuso
TSW 19 TSW 20
TSW 21 TSW 22
Variáveis read
shell sintax
– não são usualmente declaradas antes de usar – read permite ler do teclado valor de variável
– criadas quando usadas pela primeira vez • termina pressionando tecla de return
– maiúsculas e minúsculas são diferenciadas
– valor de uma variável: $ antes do nome #!/bin/sh
mostra conteúdo
$ meuscumprimentos=Alo echo Entre algum texto da variável
$ echo $meuscumprimentos precisa de apóstrofes read texto
$texto
Alo se contém espaços echo $texto
$ meuscumprimentos= ”Tudo bem” echo '$texto' agora contém $texto
$ echo $meuscumprimentos
Tudo bem
$ meuscumprimentos=9+3 mostra o string $texto
$ echo $meuscumprimentos
9+3
lab lab
TSW 23 TSW 24
4
Apóstrofes na shell Variáveis de ambiente
para conter
#!/bin/sh
4 pequena pausa para falar espaços
sobre apóstrofes simples e
4 são variáveis pré-definidas
myvar="Hi there"
duplas – valores são obtidos do sistema quando um
echo $myvar
echo "$myvar"
script inicia execução
mostra string $myvar mostra valor • dependem do ambiente de execução
echo '$myvar' da variável
echo \$myvar • normalmente maiúsculas
– para distinguir das variáveis do usuário (geralmente
\ remove qualquer echo Enter some text minúsculas)
significado especial read myvar
• dependem da configuração particular do ambiente
de $
echo '$myvar' now equals $myvar
exit 0
exemplos: $HOME, $PATH, $#, $$
lab
TSW 25 TSW 26
Mais algumas
Algumas variáveis de ambiente variáveis de ambiente
– $HOME – $PS1
• diretório pessoal (home) do usuário atual • command prompt (usualmente $)
– $PATH – $PS2
• lista de diretórios onde procurar por comandos • command prompt secundário (usualmente >)
– separado por : (dois pontos) – $IFS
/usr/local/bin:/bin:/usr/bin:.:/home/neil/bin
exemplo • separador de campos de entrada
• usualmente
– $# número de parâmetros passados
– espaço
– $$ o process ID da shell script – tab
– nova linha
TSW 27 TSW 28
Parâmetros Exemplo
salvar o arquivo com o nome #!/bin/sh
– variáveis adicionais são criadas quando a shell de tentar_var salutation="Hello"
é invocada com parâmetros echo $salutation
não esquecer echo "The program $0 is now running"
• se a shell for invocada sem parâmetros então chmod +x tentar_var echo "The second parameter was $2"
$# possui o valor 0 (zero) echo "The first parameter was $1"
echo "The parameter list was $*"
• $1, $2, ... parâmetros dados ao script echo "The user's home dir is $HOME"
• $* lista de todos os parâmetros echo "Please enter a new greeting"
read salutation
separados pelo 1o. caracter em IFS echo $salutation
• $@ variação de $* que não usa IFS o que acontece? echo "The script is now complete"
exit 0
executar
IFS: separador de campos de entrada $ ./tentar_var foo bar baz
lab
TSW 29 TSW 30
5
Teste de condições Comparação de strings
4 comando de teste Comparação Verdadeiro se:
– duas formas equivalentes string1 = string2 São iguais
[ ] não esquecer dos espaços
test string1 != string2 Não são iguais
– condições de teste
exemplos serão vistos -n string String não é nulo
• 3 categorias junto a estruturas de
– comparação de strings controle -z string String é null (string vazio)
– comparação aritmética
– características de arquivos
TSW 31 TSW 32
Estruturas de controle if
if condition
then
4 if teste de condição
statements #!/bin/sh
else
4 elif para else statements echo "Is it morning? yes or no"
for variable in values fi read timeofday teste: observe espaços
do
4 for statements
done while condition; do
if [ $timeofday = "yes" ]; then
echo "Good morning"
statements
4 while done
else
problema se entrar algo
echo "Good afternoon"
until condition; do diferente de yes ou no
4 until statements
fi
done pode ser resolvido com mais
case variable in exit 0 um teste no ramo else
4 case pattern [ | pattern] ...) statements;;
pattern [ | pattern] ...) statements;;
esac lab
TSW 35 TSW 36
6
elif problema??? entrando com return
#!/bin/sh
elif & if & teste com apóstrofes for for variable in values
do
#!/bin/sh statements
#!/bin/sh done
echo "Is it morning? Please answer yes or no" for foo in bar fud 43
lista de valores bar fud 43
read timeofday do
apóstrofes echo $foo
if [ "$timeofday" = "yes" ] done
then
exit 0 $(comand)
echo "Good morning"
elif [ "$timeofday" = "no" ]; then #!/bin/sh fornece a lista para o for
echo "Good afternoon"
else for file in $(ls f*.sh); do
echo "Sorry, $timeofday not recognized." echo $file
echo "Enter yes or no"
done
exit 1
fi exit 0
exit 0
lab lab
TSW 39 TSW 40
7
case case variable in
pattern [ | pattern] ...) statements;;
case
pattern [ | pattern] ...) statements;;
esac forma mais curta: agrupando alguns ramos
#!/bin/sh #!/bin/sh
echo "Is it morning? Please answer yes or no" echo "Is it morning? Please answer yes or no"
read timeofday read timeofday
TSW 43 TSW 44
echo "Is it morning? Please answer yes or no" 4 permite executar uma série de comandos
read timeofday
case "$timeofday" in – lista E (AND list)
yes | y | Yes | YES )
echo "Good Morning" • executa o próximo comando apenas se todos os
set echo "Up bright and early this morning?" anteriores executam com sucesso
;;
[nN]* ) • executa enquanto comando retorna TRUE
echo "Good Afternoon"
;; – lista OU (OR list)
* )
echo "Sorry, answer not recognised" • executa o próximo comando apenas se todos os
echo "Please answer yes or no"
exit 1
anteriores executam sem sucesso
;; saída com código 1 • executa enquanto comando retorna FALSE
esac
exit 0
TSW 45 TSW 46
Lista E Lista OU
statement1 && statement2 && statement3 && .. statement1 || statement2 || statement3 || ..
#!/bin/sh #!/bin/sh
teste retorna FALSE
touch f_one teste retorna FALSE rm -f f_one
rm -f f_two
if [ -f f_one ] || echo "hello" || echo "there"
if [ -f f_one ] && echo "hello" && [ -f f_two ] && echo "there" then
then echo -e "in if" executa não executa
echo -e "in if" else
não executa
else echo -e "in else"
echo -e "in else" fi
fi ramo else é executado porque exit 0 ramo then é executado porque
exit 0 condition é FALSE (terceiro condition é TRUE (segundo
comando da lista AND) comando da lista OR)
rm : remove arquivo
touch : verifica se arquivo
existe, senão cria
rm : remove arquivo
lab lab
TSW 47 TSW 48
8
Listas E e OU Blocos de comandos
– listas E e OU retornam valor do último 4 usar { }
comando avaliado • permitem construir um bloco de comandos
• lista E: geralmente falso (a menos que todos os – blocos são usados para colocar múltiplos
comandos da lista retornem verdadeiro)
comandos onde apenas um comando é
• lista OU: geralmente verdadeiro (a menos que todos
permitido
os comandos da lista retornem falso)
{
– listas E e OU podem ser combinadas statement
• exercício para especialistas em lógica statement
statement
exemplo: [ -f .profile ] && exit 0 || exit 1
}
TSW 49 TSW 50
9
Função: mais um exemplo Comandos
fonte: my_name
echo "Original parameters are $*" lista de todos parâmetros 4 normais qualquer comando UNIX válido
Execução de comandos:
expressões
expansão aritmética usadas em expr e em $(( … ))
Expressão Descrição
4 $((...)) expr1 | expr2 expr1 se expr1 não é zero, senão expr2
expr1 & expr2 zero se qualquer expr for zero, senão expr1
– alternativa ao comando expr expr1 = expr2 igual
• expr é lento pois invoca nova shell para execução da expr1 > expr2 maior que
expr1 <= expr2 maior que ou igual
expressão expr1 < expr2 menor que
#!/bin/sh expr1 <= expr2 menor que ou igual
expr1 != expr2 diferente
x=0 expr1 + expr2 soma
while [ “$x” -ne 10 ]; do expr1 - expr2 subtração
echo $x expr1 * expr2 multiplicação aritméticas
x=$(($x+1))
expr1 / expr2 divisão inteira
done
expr1 % expr2 módulo
exit 0
TSW 59 TSW 60
10
Fim de programação usando shell
– vimos uma breve introdução ao potencial de
programação usando shell
– domínio dos recursos vem com a prática
• muitos dos problemas de administração de um
sistema UNIX podem ser facilmente resolvidos com
programas shell aproveitando os recursos
disponíveis
TSW 61
11