Baixe Programação em Linux-Shell e outras Notas de estudo em PDF para Informática, somente na Docsity!
Programação em Shell
Taisy Weber
TSW 2
Programação em shell
4 Comandos básicos bash
4 Programação em shell
- pipe,
- redirecionamento de entrada e de saída,
- comandos,
- variáveis, estruturas de controle e condicionais
- criação de scripts
Matthew & Stones cap 2
LDP, manuais para usuários
manuais UNIX e Linux
TSW 3
Apoio bibliográfico
– comandos: preferencialmente man , info e LDP
– programação em shell
- Matthew, N; Stones, R. "Beginning Linux
Programming", Wrox press, 1999 (2th Edition) -
capítulo 2
» conferir programas e scripts em:
http://www.wrox.com
- Ball, B. Usando Linux. Campus
Capítulo 22. Rápida introdução. Adequado para quem não
domina o inglês.
Siever, E. Linux in a Nutsell. O’Reilly
cópia no servidor gaea.inf.ufrgs.br pasta ProgLinux
TSW 4
Shell
4 processador de comandos
4 linguagem de programação (interpretador)
- adequada para prototipação
- programação rápida e simples
- ideal para pequenos utilitários
- fácil manutenção, configuração
- grande portabilidade
4 controle de tarefas
reuso de código
mas os programas não
são muito eficientes
TSW 5
Várias shells
4 UNIX permite vários programas shell
- o usuário escolhe um de sua preferência
– mais comuns
- sh (Bourne) shell original do UNIX
- csh, tcsh e zsh C shell (Bill Joy)
- ksh, pdksh Korn shell (David Korn)
- bash Bourne Again Shell
muito popular em Linux
existe um grande número de outras shells
características são mais ou menos comuns
TSW 6
bash
– POSIX-compatível
- shell deve estar instalada em /bin/sh
- verificar com comando ls -l /bin/sh
– comandos bash
- antes de entrarmos em programação shell é necessário conhecer os comandos básicos da shell
Comandos Linux e MS-DOS guardam alguma
semelhança. Partes do MS-DOS foram inspiradas no
CP/M, que por sua vez foi inspirado no UNIX.
lab
COMMAND.COM shell única do DOS
TSW 7
Comandos UNIX
– se você não possui domínio dos comandos
básicos UNIX, está na hora de:
- explorar os comandos UNIX (Linux)
- estabelecer uma relação entre os comandos básicos e o
MS-DOS
- familiarizar-se com os conceitos elementares de operação
de ambientes UNIX
- aprender a usar redirecionamento e pipes
- exercite-os listando arquivos diretórios, verificando o estado de processos ...
não tenha medo de experimentar!
lab
use man
TSW 8
Resumo de alguns comandos
ls : lista conteúdo de um diretório dado, se nenhum é dado lista o atual
cat : lê e mostra arquivos em stout , se não aparece arquivo então stin ,
permite concatenação
more : display o conteúdo do arquivo, uma tela de cada vez
grep : pesquisa em um ou mais arquivos por linhas que casam com uma
expressão regular dada ( -l : listar)
chmod : altera as permissões de acesso de um arquivo
touch : verifica se existe arquivo, senão cria
rm : remove arquivo
lab
revisar
use man
TSW 9
Redirecionamento
4 entrada e saída padrão
– stdin
– stdout
– entrada e saída padrão e descritores de arquivo
- stdin - file descritor 0
- stout - file descritor 1
- st error out - file descritor 2
– redirecionamento
- troca um arquivo padrão por outro arquivo indicado
entrada padrão
saída padrão
também stin e stout
TSW 10
Redirecionamento (>) de stout
– exemplo simples:
$ ls -l > lssaida.txt
– CUIDADO!!!
- o redirecionamento escreve sobre o arquivo (se o arquivo já existe) apagando o conteúdo anterior
salva a saída do comando ls no arquivo lssaida.txt
redireciona saída
ls : lista o conteúdo de um diretório dado; se nenhum
diretório é dado, lista o diretório atual
TSW 11
Usando cat e >
– comando cat
$ cat rel.txt > novorel.txt
$ cat rel1 rel2 rel3> novorel.txt
$ cat > novorel.txt
>isso é uma linha de texto
>isso é mais uma linha de texto
>[EOF]
$ cat novorel.txt
lab
digite Crt+D para marca de fim de arquivo
exemplo : Ball, B. Usando Linux. pg 21
cat : lê e mostra arquivos em stout;
permite contatenação
TSW 12
Append >>
4 >> ( append )
– anexa a saída ao fim de um arquivo
- evita apagar um arquivo que já existe como em >
- também existe << (raro uso)
TSW 19
Exemplo de programa interativo
– determinar todos os arquivos que contém o
string POSIX
$ for arquivo in *
> do
> if grep -l POSIX $arquivo
> then
> more $arquivo
> fi
> done
primeira forma
arquivo é uma variável e
$arquivo seu conteúdo
grep e more são comandos
grep : pesquisa em um ou mais arquivos por linhas que
casam com uma expressão regular dada ( -l : listar)
more : mostra o conteúdo do arquivo, uma tela de cada vez
TSW 20
Programa interativo x script
4 programa interativo
– desvantagem
- digitar o programa cada vez que for necessário
- inibe reuso
4 shell script
- armazenar programa em um arquivo
- invocar o arquivo
– vantagem
- scripts possibilitam reuso
primeira forma
segunda forma
TSW 21
Exemplo de shell script
4 arquivo chamado
primeiro.sh
- .sh sem significado
indica comentário
- #! comentário especial
- indica qual programa deve ser usado para executar o arquivo
- /bin/sh =shell default
- exit 0
- código de retorno
- 0 indica sucesso
#!/bin/sh
primeiro.sh
compilar apenas os arqs.
contendo string POSIX
for file in * do if grep -l POSIX $file then more $file fi done exit 0
TSW 22
Executando scripts
– forma fácil
- invocar a shell com o nome do arquivo
– forma mais elegante
- invocar diretamente
- pode não funcionar
- o arquivo pode não ser localizado (se PATH não foi
atualizada para procurar no diretório atual)
$ /bin/sh primeiro.sh
$ chmod +x primeiro.sh $ primeiro.sh
chmod : altera as permissões
de acesso de um arquivo
+x : adiciona modo executável
TSW 23
Variáveis
– não são usualmente declaradas antes de usar
- criadas quando usadas pela primeira vez
- maiúsculas e minúsculas são diferenciadas
- valor de uma variável: $ antes do nome
shell sintax
$ meuscumprimentos=Alo $ echo $meuscumprimentos Alo $ meuscumprimentos= ”Tudo bem” $ echo $meuscumprimentos Tudo bem $ meuscumprimentos=9+ $ echo $meuscumprimentos 9+
precisa de apóstrofes
se contém espaços
lab TSW 24
read
– read permite ler do teclado valor de variável
- termina pressionando tecla de return
#!/bin/sh
echo Entre algum texto read texto echo $texto echo '$texto' agora contém $texto
lab
mostra o string $texto
mostra conteúdo
da variável
$texto
TSW 25
Apóstrofes na shell
4 pequena pausa para falar
sobre apóstrofes simples e
duplas
#!/bin/sh
myvar="Hi there"
echo $myvar echo "$myvar"
echo '$myvar' echo $myvar
echo Enter some text read myvar
echo '$myvar' now equals $myvar
exit 0
mostra valor
da variável
mostra string $myvar
\ remove qualquer
significado especial
de $
para conter
espaços
lab TSW (^) 26
Variáveis de ambiente
4 são variáveis pré-definidas
– valores são obtidos do sistema quando um
script inicia execução
- dependem do ambiente de execução
- normalmente maiúsculas
- para distinguir das variáveis do usuário (geralmente
minúsculas)
- dependem da configuração particular do ambiente
exemplos: $HOME, $PATH, $#, $$
TSW 27
Algumas variáveis de ambiente
– $HOME
- diretório pessoal ( home ) do usuário atual
– $PATH
- lista de diretórios onde procurar por comandos
- separado por : (dois pontos) /usr/local/bin:/bin:/usr/bin:.:/home/neil/bin
– $# número de parâmetros passados
– $$ o process ID da shell script
exemplo
TSW 28
Mais algumas
variáveis de ambiente
– $PS
- command prompt (usualmente $)
– $PS
- command prompt secundário (usualmente >)
– $IFS
- separador de campos de entrada
- usualmente
TSW 29
Parâmetros
– variáveis adicionais são criadas quando a shell
é invocada com parâmetros
- se a shell for invocada sem parâmetros então $# possui o valor 0 (zero)
- $1, $2, ... parâmetros dados ao script
- $* lista de todos os parâmetros
separados pelo 1o. caracter em IFS
- $@ variação de $* que não usa IFS
IFS: separador de campos de entrada
TSW 30
Exemplo
salvar o arquivo com o nome
de tentar_var
não esquecer
chmod +x tentar_var
executar
$ ./tentar_var foo bar baz
o que acontece?
#!/bin/sh
salutation="Hello" echo $salutation echo "The program $0 is now running" echo "The second parameter was $2" echo "The first parameter was $1" echo "The parameter list was $*" echo "The user's home dir is $HOME"
echo "Please enter a new greeting" read salutation echo $salutation echo "The script is now complete" exit 0
lab
TSW 37
elif
#!/bin/sh
echo "Is it morning? Please answer yes or no" read timeofday
if [ $timeofday = "yes" ] then echo "Good morning" elif [ $timeofday = "no" ]; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized. Enter yes or no" exit 1 fi
exit 0
script termina com valor 1
segundo teste
ainda tem um problema se entra return
lab TSW (^) 38
problema???
– problema com o if
- timeofday será considerado como:
– para evitar esse problema
- usar apóstrofes
- timeofday será considerado como:
entrando com return
if [ = "yes" ]
if [ $timeofday = "yes" ]
condição inválida
gera mensagem de erro
if [ "$timeofday" = "yes" ]
if ["" = "yes" ]
condição válida
TSW 39
elif & if & teste com apóstrofes
#!/bin/sh
echo "Is it morning? Please answer yes or no" read timeofday
if [ "$timeofday" = "yes" ] then echo "Good morning" elif [ "$timeofday" = "no" ]; then echo "Good afternoon" else echo "Sorry, $timeofday not recognized." echo "Enter yes or no" exit 1 fi
exit 0 lab
apóstrofes
TSW 40
for
#!/bin/sh
for foo in bar fud 43 do echo $foo done exit 0 #!/bin/sh
for file in $(ls f*.sh); do echo $file done exit 0
lab
for variable in values do statements done
lista de valores bar fud 43
$(comand)
fornece a lista para o for
TSW 41
while
#!/bin/sh
echo "Enter password"
read trythis
while [ "$trythis" != "secret" ]; do
echo "Sorry, try again"
read trythis
done
exit 0
#!/bin/sh
foo= while [ "$foo" -le 20 ] do echo "Here we go again" foo=$(($foo+1)) done exit 0 lab
while condition; do statements done
apóstrofes desnecessárias
TSW 42
until
#!/bin/sh
until who | grep "$1" > /dev/null do sleep 60 done
Now ring the bell
and announce the expected user
echo -e \a echo "*** $1 has just logged in ***"
exit 0
until condition; do statements done
loop até usuário com login dado pelo
parâmetro $1 logar-se na máquina
toca o alarme
pipe
TSW 43
case
#!/bin/sh
echo "Is it morning? Please answer yes or no"
read timeofday
case "$timeofday" in
"yes") echo "Good Morning";;
"no" ) echo "Good Afternoon";;
"y" ) echo "Good Morning";;
"n" ) echo "Good Afternoon";;
* ) echo "Sorry, answer not recognised";;
esac
exit 0
case variable in pattern [ | pattern] ...) statements;; pattern [ | pattern] ...) statements;; esac
executa o primeiro comando que casa e finaliza
bom aparecer sempre no fim
TSW 44
case
#!/bin/sh
echo "Is it morning? Please answer yes or no" read timeofday
case "$timeofday" in yes | y | Yes | YES ) echo "Good Morning";; n* | N* ) echo "Good Afternoon";;
- ) echo "Answer not recognised";; esac
exit 0
forma mais curta: agrupando alguns ramos
expansão do wildcard * em N* e n* pode casar com
um grande número de palavras, não apenas NO e no
exemplo do uso de * em case
TSW 45
case
#!/bin/sh
echo "Is it morning? Please answer yes or no" read timeofday case "$timeofday" in yes | y | Yes | YES ) echo "Good Morning" echo "Up bright and early this morning?" ;; [nN]* ) echo "Good Afternoon" ;;
- ) echo "Sorry, answer not recognised" echo "Please answer yes or no" exit 1 ;; esac exit 0
saída com código 1
set
outra variação
TSW 46
Listas de comandos
4 permite executar uma série de comandos
– lista E ( AND list )
- executa o próximo comando apenas se todos os anteriores executam com sucesso
- executa enquanto comando retorna TRUE
– lista OU ( OR list )
- executa o próximo comando apenas se todos os anteriores executam sem sucesso
- executa enquanto comando retorna FALSE
TSW 47
Lista E
#!/bin/sh
touch f_one rm -f f_two
if [ -f f_one ] && echo "hello" && [ -f f_two ] && echo "there" then echo -e "in if" else echo -e "in else" fi exit 0
touch : verifica se arquivo
existe, senão cria
rm : remove arquivo
teste retorna FALSE
não executa
ramo else é executado porque
condition é FALSE (terceiro
comando da lista AND)
lab
statement1 && statement2 && statement3 && ..
TSW 48
Lista OU
#!/bin/sh
rm -f f_one
if [ -f f_one ] || echo "hello" || echo "there" then echo -e "in if" else echo -e "in else" fi exit 0
rm : remove arquivo
teste retorna FALSE
não executa
ramo then é executado porque
condition é TRUE (segundo
comando da lista OR)
lab
statement1 || statement2 || statement3 || ..
executa
TSW 55
Função: mais um exemplo
echo "Original parameters are $*"
if yes_or_no "$1" then echo "Hi $1, nice name" else echo "Never mind" fi
exit 0
lista de todos parâmetros
chamada de função com
passagem de um parâmetro
teste de valor numérico
0 verdadeiro
1 falso
lab
programa principal com invocação da função
fonte: my_name
executar com $ ./my_name.sh Taisy Weber
TSW 56
Comandos
4 normais
- comandos que podem ser executados a partir do prompt da shell, não apenas dentro de um script
4 internos ( built-in )
- comandos que só podem ser executados dentro de um script
- não podem ser invocados externamente
- para alguns deles existem programas externos
correspondentes
- os internos são mais eficientes
qualquer comando UNIX válido
TSW 57
Alguns comandos
4 break
4 continue
4 echo
4 eval
4 exec
4 exit n
4 export
4 expr
4 printf
4 return
4 set
4 shift
4 trap
4 unset
mostra um string
gera saída
formatada, só
disponível
recentemente
ver $(( ))
TSW 58
Execução de comandos
4 $(command)
– captura o resultado da execução de um
comando e permite colocar em uma variável
- resultado é uma string (saída do comando)
- resultado não é estado de retorno
evitar forma antiga‘command’
#!/bin/sh
echo diretorio atual e’ $PSW echo usuario atual é $(wo)
exit 0 PSW variável de ambiente (não comando)
wo é comando e por isso leva ( )
TSW 59
Execução de comandos:
expansão aritmética
– alternativa ao comando expr
- expr é lento pois invoca nova shell para execução da expressão
#!/bin/sh
x= while [ “$x” -ne 10 ]; do echo $x x=$(($x+1)) done
exit 0
TSW 60
expressões
Expressão Descrição
expr1 | expr
expr1 & expr
expr1 = expr
expr1 > expr
expr1 <= expr
expr1 < expr
expr1 <= expr
expr1 != expr
expr1 se^ expr1 não é zero, senão^ expr
zero se qualquer expr for zero, senão expr
igual
maior que
maior que ou igual
menor que
menor que ou igual
diferente
expr1 + expr
expr1 - expr
expr1 * expr
expr1 / expr
expr1 % expr
soma
subtração
multiplicação
divisão inteira
módulo
aritméticas
usadas em expr e em $(( … ))
TSW 61
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