Buscar

Curso-shell-script

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 61 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação C-Shell
1
PROGRAMAÇÃO
SHELL
Autoras: Universidade Estadual de Campinas
Cristiana Munhoz Eugênio Centro de Computação
Lilliam Cássia Ciani Palermo Versão: 6 - Fevereiro 2000
Colaboradores - Agradecimentos Especiais:
Cristina Maria Zanini
Rubens Queiroz de Almeida
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
2
O que é Shell ?
 
 
• programa que conecta e interpreta os comandos
 
• linguagem de programação completa - interpretada
 
• possui variáveis;
• construções condicionais e interativas;
• ambiente adaptável ao usuário;
 
• é uma das linguagens originais de quarta geração
(4GL).
 
 
Simplicidade do Shell
• Pipeline
• Sistemas de arquivos
• Sistema operacional UNIX
Notas:
• O programa shell interpreta os comandos que você digita quando
trabalha com o sistema operacional e traduz para comandos que o
kernel compreende.
• Shell: é uma linguagem de programação completa, possuindo
variáveis, construções condicionais, interativas e ambiente
adaptável ao usuário. O Shell do Unix é a ferramenta original de
protótipo rápido que ensina conceitos-chaves como modularidade,
reutilização e desenvolvimento.
• Os comandos do Shell se comunicam entre si por meio de uma
interface simples e coerente chamada conduto (pipeline).
 
• O Shell permite que o usuário realize suas atividades sem afetar
qualquer outro processo que não lhe pertence. Quando um
usuário conecta-se a um sistema Unix, o sistema operacional
inicia automaticamente uma cópia do Shell, sob a qual o usuário
poderá realizar qualquer função disponível.
 
• O shell utiliza o sistema de arquivos do UNIX que permite
organizar arquivos em pastas (diretórios). Esta hierarquia de
diretórios e arquivos gera uma visão simples e clara de toda a
informação no sistema.
 
• O UNIX é transportável; ele roda em quase todo hardware de
computadores fabricados atualmente. Seu investimento não será
desperdiçado, pois qualquer programa escrito é largamente
portável entre Unix’es de diferentes plataformas e fornecedores.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
3
Quando usar
Interativamente
• Realizar uma operação simples, uma única vez
• Interagir com o comando
O Shell Script deverá ser utilizado sempre que for
necessário realizar:
• um procedimento complexo usando muitas linhas de
comando;
 
• um procedimento do qual todos os usuários poderão
beneficiar-se;
 
• um comando simples usado inúmeras vezes;
 
• uma tarefa numa data planejada;
• integrar informações de vários sistemas existentes;
 
Notas:
• A qualquer momento que você executa algum comando (ls, cat),
você está usando o Shell interativamente: stdin, stdout e stderr
são todos direcionados para o terminal.
• Stdin => standart input
• Stdout = > standart output
• Stderr => standart error
• Quando você começa a usar o Shell interativamente e descobre
que alguns processos exigem muita digitação, é hora de aprender
sobre a programação Shell. Deve-se colocar esses comandos
interativos em um arquivo executável. Você poderá reutilizar
sempre que precisar, melhorando ainda mais a sua produtividade.
• O Shell pode extrair e manipular grandes quantidades de
informações. Por que pesquisar um relatório inteiro quando o Shell
pode verificar e recuperar informações importantes para você sem
qualquer esforço ?
• A composição de sistemas a partir de programas do Shell realizará
quase todas as tarefas necessárias. Em vez de esperar meses ou
anos para a “solução perfeita”, aplicações protótipo do Shell
podem ser desenvolvidas, melhoradas e implementadas. Quando
necessário, elas poderão ser utilizadas como especificações de
requisitos para o desenvolvimento de um sistema “real”.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
4
Produtividade
• Linguagem interpretada - não compilada
•
 Um programador médio pode duplicar ou triplicar sua
produtividade com o uso do Shell
 
•
 Comparação de Bruce Cox (pai do Objetive C)
shell 1 linha de código
linguagem orientada a objeto10 linhas de código
linguagem C 100 linhas de código
Notas:
•
 Não é de se espantar que o Shell possa duplicar ou triplicar a
produtividade pois ele pode automatizar a maior parte das tarefas
recursivas, que compreendem de 50 a 80% das atividades
intensamente humanas. A simplicidade dos arquivos do UNIX e do
projeto de sistema de arquivo possibilitam isso.
 
É necessário alguns conhecimentos internos do Shell e do seu uso
para derivar desses benefícios. Mas, é preciso apenas alguma
inventividade para tornar-se mais eficiente e produtivo.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
5
Filtros
(teclado)
• grep -i “Arthur” capit1
 Autor: Lowel Arthur
Rei Arthur e os Cavaleiros da Távola
• cat
• cat arquivo
• sed -e “s/shell/Shell/g” capit1
 
O comando sed abrirá o arquivo “capit1” como stdin e passará o
arquivo para stdout (terminal) enquanto muda todas as
ocorrências de “shell” para “Shell”.
Notas:
• Uma chave para transformar dados brutos em informação útil é
filtrar os dados estranhos.
 
• Você pode pensar na maior parte dos comandos do Shell como
filtros.
 
• Cada comando também possui duas saídas:
• saída-padrão --> stdout
• saída-de-erro --> stderr
• Cada comando filtra dados da entrada-padrão ou transforma-os
de algum modo, passando-os à saída-padrão. Quaisquer erros
encontrados são passados à saída-de-erro.
 
• Alguns filtros extraem apenas os dados que você deseja ver,
outros incluem ou alteram os dados conforme suas instruções.
 
 FILTRO STDIN STDOUT (tela)
STDERR (tela)
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
6
Redirecionamento
• Criar ou anexar arquivos;
 
• Usar arquivos existentes como entrada para o Shell;
 
• Reunir dois fluxos de saída;
 
• Usar parte do comando shell como entrada.
Operadores:
< arquivo direciona um arquivo para stdin
> arquivo direciona stdout para uma nova saída
>> arquivo anexa stdout a um arquivo existente
>>& anexa stderr a stdout
1> arq_ok 2> arq_erro
 direciona resultado do shell p/ arq_ok
 e msg de erros para arq_erro
<< delimitador direciona stdin do shell até o delimitador
Notas:
• Você pode usar o redirecionamento de E/S para mudar a direção
de stdin/stdout e stderr.
 Exemplo:
 sed -e “s/shell/Shell/g” < capit1 > novocapit1
• O stderr ainda estaria direcionado para o terminal
• Redirecionar stderr para um arquivo pode ser ocasionalmente útil
para depurar um comando Shell. Para combinar stderr com stdout,
use :
 Exemplo:
 
sed -e “s/shell/Shell/g” capit1 1> novocapit1 2> erro
 
 Sintaxe: comando argumentos >>& arqsaida
• O arquivo de saída terá todos os dados da saída-padrão e
da saída-de-erro criados pelo comando do shell.
• Se o arquivo novocapit1 não existir, então o Shell o criará.
• Se existir, o Shell anexará o texto no arquivo.
• mail lilliam < /sistemas/acad/jobs/MA31C
• << : este dispositivo de redirecionamento, usa linhas de dados
dentro do comando do Shell como entrada. Em vez de ter um
arquivo separado como entrada para o comando, vocêpoderá
incluí-lo diretamente com o comando do Shell
 
Exemplo:
 ftp -niv ftp.unicamp.br << EOF!
 user anonymous password maria@unicamp.br
cd /tmp
get apostila.ps
EOF!
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
7
Conduto
• Conecta stdout de um comando à stdin de outro
• O resultado da execução de um comando pode ser
utilizado como parâmetro de entrada na execução de
outro comando
• Meio de condução para transportar dados de um
comando para o outro
 
• Exemplos:
 
grep matricula /sistemas/acad/jobs/* | wc -l | sort
 
ls -la | grep -i Jan "é diferente de" ls -la
Notas:
• Os comandos do Shell podem ser reutilizados, acoplados e
moldados para lidar com as mais difícieis aplicações de
informação.
 
• Além de eliminar arquivos temporários, o conduto permite que dois
comandos operem ao mesmo tempo.
 
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
8
Construção de um Shell Script
• Edite um arquivoÎ vi meu-programa
• Esse arquivo deve conter na primeira linha:
 
• #! /bin/ksh
• # Î
Î
 utilize para comentar uma linha
• /bin/rm arquivo
 É recomendável passar o “caminho” (path) dos comandos
 
• \rm arquivo
Garante encontrar a primeira ocorrência no path.
• As shells devem estar sempre num diretório comum, por
exemplo: /usr/sys/nome-sistema
• Arquivos de controle que são gerados pela shell devem
estar num diretório temporário, separado das shells.
Notas:
• #! /bin/ksh ÎÉ utilizado para que o Unix saiba que sua shell é
korn shell.
• É recomendável passar o “caminho” do comandos, pois cada
usuário pode criar na sua área um alias para qualquer comando.
 
• Os comandos ficam geralmente no diretório /bin
• Outra opção seria colocar scape antes do comando, por
exemplo \rm. Garante que você estará utilizando a 1a.
ocorrência encontrada no path definido no seu .kshrc
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
9
Caracteres especiais do Shell
• “ “ (aspas duplas)
Mostra a cadeia de caracteres citada entre ", substituindo
o nome da variável pelo seu conteúdo.
Ex: dia_da_semana=Segunda-feira
 echo “ Hoje é $dia_da_semana ”
 resultado : Hoje é Segunda-feira
• ‘ ‘ (aspas simples)
Mostra a cadeia de caracteres citada entre ', sem
substituir o nome da variável pelo seu conteúdo.
Ex: dia_da_semana=Segunda-feira
 echo ' Hoje é $dia_da_semana '
 resultado : Hoje é $dia_da_semana
• ` ` (crase)
O resultado do comando é usado em output.
Ex: data= `date +%D `
• \ (barra invertida)
Transcreve um caracter especial
Notas:
• A utilização de caracteres especiais dentro de uma citação dará
problemas. Para isso utilize o recurso da “barra invertida”.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
10
Caracteres especiais do SHELL
• ; (vírgula)
Separador de comando sequencial.
Ex: date; ksh meu_shell; date > /tmp/result &
• ? ( ponto de interrogação )
Combina com qualquer caracter isolado .
• * (asterisco)
Combina com qualquer cadeia de caracter.
• [a-z]*
Combina com algo que consista de caracteres alfabéticos
minúsculos .
• ^string
Procura a string somente no começo da linha
• string$
Procura a string somente no fim da linha
Notas:
Exemplos:
Suponha que no diretório corrente exista os seguintes arquivos:
capit1 , capit2, capit3, capit4 e capitulo
ls capit* (aparecerá os 5 arquivos)
ls capit? (capit1, capit2, capit3, capit4)
ls capit[1-3] (capit1, capit2, capit3)
• os caracteres "?", "*" e "[a-z]" podem ser usados no meio de
uma string
ls cap?t
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
11
Tipo de Variáveis
• Global:
Seta variáveis de ambiente ou variáveis globais. Elas
existem enquanto a sessão estiver aberta.
Sintaxe: export nomevar=valor
 Exemplos:
 
export TERM=vt100 (variável de ambiente)
 export DBDATE=Y4MD- (variável de ambiente)
export matricula=20444 (variável global)
 
 
• Local:
 Seta variáveis locais. Elas existem somente durante a
execução da Shell.
 
 Sintaxe: nomevar=valor
 
 
 
 
PARA SABER QUAIS VARIÁVEIS ESTÃO SETADAS E
QUAIS SÃO SEUS VALORES, UTILIZE O COMANDO
SET.
 
 
Notas:
•
 EXPORT:
•
 Seta variáveis de ambiente ou globais. Existem enquanto a
sessão estiver aberta.
•
 export PS1="`hostname`{`whoami`}$ "
magda{maria}$
•
 
NÃO
 existe espaço em branco entre o nome da variável e seu
conteúdo
•
 nome=Rogério
•
 Nomes de Variáveis não pode conter hifen.
•
 nota-aluno Î dará erro X
•
 É permitido o uso do underline para nome de variáveis:
•
 minha_var
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
12
Definição de variáveis
• String
•
 Atribuindo valores:
Sintaxe : nome=conteúdo
Exemplos:
 msg_ftp=“221 Quit command received.”
 dir_log=~liliam/tmp
 meus_arqs=`ls -la`
•
 Concatenando strings:
 Exemplos:
 nome=Li
 nome1=lliam
 conc=$nome$nome1
 echo $conc Æ Lilliam
NOMES DE VARIÁVEIS NÃO PODEM CONTER
HÍFEN.
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
13
Definição de variáveis
• String
•
 Utilizando string:
Utilize "$" para substituir o nome da variável pelo seu
conteúdo.
 Sintaxe : $variável
 
Exemplos:
cabec=“ Relatório do ano $ano”
dir_log=/tmp ; ls $dir_log
aluno=${nomes[$cont]}
parm1=$1
ls arq$var
dia=Segunda-feira ; echo “ Hoje é dia $dia “
Notas:
•
 
Não deixe espaço em branco entre o cifrão ($) e o nome da
variável.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
14
Definição de variáveis
• Inteiro
•
 Atribuindo valores do tipo INTEIRO
 Exemplos:
let cont=1 ou cont=1
let soma=$cont+2
let x=' 1 + 4 ' ou let x=1+4
let x=$x+1
NÃO DEIXAR ESPAÇO ENTRE O NOME DA
VARIÁVEL E O SINAL DE IGUAL
NÃO É NECESSÁRIO INICIALIZAR UMA VARIÁVEL
COM O COMANDO LET PARA ELA SER DO TIPO
INTEIRA, UTILIZE O "LET" APENAS QUANDO VOCÊ
QUISER MANIPULÁ-LA .
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
15
Definição de variáveis
• Array
 
•
 Criando arrays:
Exemplos:
set -A var a b c
set -A nomes ana jose maria
•
 Incrementando arrays:
Exemplos:
nomes[3]=joão
aluno=${nomes[[3]}
echo $aluno ÆÆ joão
•
 
Manipulando arrays:
•
 
${var[*]}
 Mostra o conteúdo do array inteiro
•
 
${#var[*]}
 Mostra o número de elementos (argumentos) de
 um array.
•
 
${variável[n]}
 Elementos posicionais de um array.
A 1ª OCORRÊNCIA DO ARRAY COMEÇA COM 0
Notas:
•
 set -A var val1 val2 val3 val4
• set -A semana Segunda Terça Quarta Quinta Sexta Î seta um
array chamado semana contendo os dias da semana
•
 Exemplos de array :
 
 set -A nome maria lucia joao
 echo ${nome[*]} Æ Resp = maria lucia joao
echo ${#nome[*]} Æ Resp = 3
• Se o indexador do array ultrapassar o número de elementos
existentes, será retornado branco
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
16
Edição de string
• typeset
Especifica o tipo do valor da variável
Sintaxe:
typeset [opções] v=$var
Opções:•
 -Ln : ajusta à esquerda. Se "n" é especificado, é
preenchido com branco ou truncado à direita no
valor de n
•
 -Rn: ajusta à direita. Se "n" é especificado, é
preenchido com branco ou truncado à esquerda
no valor de n
•
 -Zn: mesmo que o acima, adiciona 0 ao em vez
de branco
•
 -l converte para minúsculo
•
 -u converte para maiúsculo
Exemplos:
alpha=" aBcDeFgHiJkLmNoPqRsTuVwXyZ "
typeset -L v=$alpha" Æ "aBcDeFgHiJkLmNoPqRsTuVwXyZ "
typset -uR5 v=$alpha Æ "VWXYZ"
typeset -Z8 v="123.50" Æ "00123.50"
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
17
Tratamento de Variáveis
• 
 testa se a variável tem conteúdo
-n str: retorna verdadeiro se variável NÃO FOR NULA
 -z str: retorna verdadeiro se variável for NULA
if [[ -z $matricula ]] then
 echo " variável matricula NÃO inicializada"
fi
matricula=23456
if [[ -n $matricula ]] then
 echo " variável matricula inicializada"
fi
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
18
Tratamento de erro
• $? - testa se o comando foi executado com
sucesso.
 
 
 0 executado com sucesso
 1 executado sem sucesso
Exemplos:
 var=5
 
echo $? ( = 0 )
 
 
 
echo $var4
 
echo $? (= 1)
 
 
 
 FAÇA UM TESTE ANTES POIS DEPENDENDO DO
SISTEMA PODE SER O CONTRÁRIO !!!!!!
 
 
 
 
 
 
 
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
19
Variáveis de ambiente
• $USER
Conteúdo do comando whoami (quem é o usuário da
conta)
• $PATH
 Lista de diretórios a serem procurados pelo meus
executáveis
 
• $HOME
 Mostra qual é o diretório home
 
• $PS1
 Mostra o que está setado como prompt
 
• $SHELL
 Mostra a shell que está sendo utilizada
 
• $TERM
Mostra qual o tipo de terminal que está sendo utilizado
• $$
Número do processo do comando corrente
Notas:
• O valor das variáveis ao lado podem ser encontrados ao
digitarmos o comando set.
• $$ Î
Î
 Muito utilizado pelos utilitários de mail que gravam o arquivo
em /tmp/arq_número_do_processo
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
20
Execução de um Shell Script
• Fora do editor vi, na linha de comando:
$ksh -opções_de_teste meu-shell parâmetros
• Gravar a execução de uma shell script
$script
$ksh -opções_de_teste meu-shell
$ CTRL D
$ more typescript
• Dentro do editor vi:
• :w ÎÎ grava o arquivo que está na memória
• :!ksh -opções de teste %
! Î
Î
 diz ao vi para executar o comando shell
seguinte
% Î
Î
 diz ao vi para preencher o nome do arquivo
corrente
Opções de Teste:
• x Î
Î
 gera saída dos comandos executados
Notas:
• Você pode executar o seu programa a medida que for sendo
desenvolvido, facilitando também a detecção e correção de erros.
• Entrando no vi e criando as primeiras linhas do programa, grave o
arquivo (:w) e execute-o sem sair do editor: (:!ksh -opção %)
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
21
Tratamento de Parâmetros
 
• $#
No. de parâmetros
• $0
Parâmetro que contém o nome do programa
• $1, $2, $3, ...
Parâmetros fornecidos
 
• $*
Lista o conteúdo de todos os parâmetros
Notas:
• Se você tem um shell script que recebe parâmetros de entrada,
você pode usar $# no começo do programa para obter o número
de argumentos (parâmetros) recebidos, testando se esse era o
número de argumentos esperado.
 Exemplo:
ksh meuscript parm1 parm2
#! /bin/ksh
 if (( $# == 2)) then
 echo " numero de parametros correto "
 fi
• ksh meuprogram parm1 parm2
 $0 $1 $2
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
22
Principais Operadores
Operação Numérico String
igual == =
diferente != !=
menor, maior <, > <, >
... ou igual >=, <= >=, <=
and , or &&, ||
soma +
subtração --
multiplicação *
divisão /
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
23
Operadores de Teste
Condição Shell Verdadeira se ...
-d file se é diretório
-f file se é file
-r arquivo existir arq. legível
-w arquivo existir arq. gravável
-x arquivo existir arq. executável
-a arquivo se arquivo existe
-s arquivo se arquivo existe e não está
vazio
-O arquivo se o username que está
logado é o owner
-G arquivo se o gid do username que
está logado é o mesmo do
arquivo
Notas:
• No núcleo de cada estrutura de controle existe um teste
condicional.
• O comando test pode determinar se um determinado nome é um
arquivo ou um diretório; se ele pode ser lido, ou se é executável; e
se uma cadeia ou inteiro é maior, menor ou igual a outro.
• Test, como qualquer outro comando do Shell, sempre retorna um
valor verdadeiro (0) ou falso (1) na variável status do shell.
test -r nomearq
echo $?
if [[ -d arq_com ]] then
echo " arq_com é um diretório "
fi
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
24
Comandos condicionais
• if - then - else
•
 
if (( expressão aritmética )) then
processa 1
else
processa 2
fi
•
 
if [[ testes condicionais ]] then
processa 1
else
processa 2
fi
PARA COMPARAÇÕES DE TESTES CONDICIONAIS E
COMPARAÇÕES DE STRINGS É NECESSÁRIOS TER
ESPAÇOS EM BRANCO ENTRE OS COLCHETES E
OS OPERADORES
Exemplo:
if [[ $a = $b ]] then
echo “variáveis iguais “
 fi
Notas:
•
 Exemplos:
Comparação numérica
a=5 ; b=7
if (( $a == $b )) then
echo “valores iguais “
else
echo “ valores diferentes”
fi
Comparação de testes condicionais
if [[ -z $parametros ]] then
echo “ ERRO - não foi passado parâmetros !!! “
exit
fi
Comparação de string
a=inteiro ; b=metade
if [[ $a = $b ]] then
echo “variáveis iguais “
else
echo “ variáveis diferentes”
fi
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
25
Comandos condicionais:
• case
case expressão in
opção1 ) processa a
echo opcao a ;;
opção2 ) processa b;;
opção3 ) processa c;;
 *
 ) echo " Opção inválida " ;;
esac
Exemplo:
 $ cria_imp -p pcca -ip 143.106.30.9 -n pcca
while (( $# ))
do
case $1 in
-ip) ip_da_impressora=$2 ; shift ;;
-p) nome_da_impressora=$2 ; shift ;;
-n) nome_da_imp_rede=$2 ; shift ;;
 esac
 shift
done
Notas:
•
 Exemplos:
data=`date | cut -c9-10`
texto="Relatorio do mes de"
case $data in
 01) echo "$texto Janeiro" ;;
 02) echo "$texto Fevereiro" ;;
 9 | 09) echo "$texto Setembro" ;;
 12) ;;
 * ) echo " ERRO !!!!!" ;;
esac
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
26
Comandos condicionais:
• for
for var in expressão
do
comandos que usam $vardone
Exemplos:
for file in *.c
do
 mv $file `echo $file | tr ´A-Z´ ´a-z ´ `
 echo $file
done
Onde expressão pode ser:
•
 resultado de um comando
•
 valores
•
 ocorrências de um array
•
 As instruções dentro do comando for serão executadas
tantas vezes quantas forem o no de elementos pertences
à expressão
Notas:
•
 Exemplos:
Utilizando array:
set -A tabela lilliam kikinha
for pessoa in ${tabela[*]}
 do
 echo $pessoa
 done
end
Utilizando o resultado de um comando:
for arquivo in `grep -l "matr_aluno" *.sqb`
do
 ex +%s/"old_string"/"new_string"/g +wq $arquivo > /dev/null
done
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
27
Comandos condicionais:
• while
dir_relatorio=~kikinha/prog
while ((1))
 do
clear
echo “ \n* Centro de Computacao* \n”
echo “Selecione a opcao desejada”
echo “ 1- Tabela de Orgaos “
echo “ 2 - Notice “
echo “ 3 - Sai “
print -n “ Æ
Æ
 “
read RESP
case $RESP in
1) $dir_relatorio/jsi03e_carga;;
2) /usr/local/notice/manager ;;
3) exit ;;
*) print -n “ Opcao Invalida - Tecle <enter> “
 read ENTER ;;
esac
done
Notas:
• Sintaxe:
while ((expressão))
 do
done
• Comando exit:
Serve para sair do while sem ser pela condição definida na
expressão.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
28
Comandos do Shell
Os comandos shell serão mostrados divididos em
várias categorias:
• Arquivos e diretórios
• Seleção
• Combinação e ordenação
• Impressão
• Segurança
Notas:
• Para cada comando existem várias opções. Neste curso
tentaremos mostrar as opções mais utilizadas. Para conhecer
outras opções ou maiores detalhes utilize o comando man:
 
 Exemplo:
 man nome_comando
 
• Comandos :
 
1. próxima linha ENTER
2. próxima página space bar
3. página anterior CTRL B
4. procura string /\caracter especial ou /string
5. continuar a busca n
6. cancelar pesquisa q ou CTRL C
OBS: Nem todos os comandos usam as opções da mesma
maneira.
 
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
29
TIPO COMANDO
Diretório cd ls pwd
mkdir rmdir
Arquivo cat cp csplit
ln mv rm split
Seleção awk
cut
grep
head
line
sed
tail
uniq
wc
Junção cat
join
paste
Ordenação sort
Transformação sed
tr
dd
Impressão cat
echo
Segurança chmod
Leitura $<
touch
sleep
exit
Notas:
Os comandos de Diretórios e Arquivos já foram abordados
anteriormente. Eles podem ser utilizados sem restrições numa shell.
Exemplos:
\rm arquivo_old >& /dev/null
\ls -la
/bin/cat arquivo
/bin/mv arqvelho arqnovo
/bin/pwd
/bin/mkdir meudir
Alguns lembretes:
cd altera o diretório corrente
ls lista o conteúdo do diretório
pwd mostra qual é o diretório corrente
mkdir cria diretório
mkdir -p cria árvore completa de diretórios
rmdir deleta diretório
cp copia arquivo
cp -p copia mantendo as características originais
mv renomeia arquivo
rm deleta arquivo
basename mostra o nome do arquivo tirando o path
dirname mostra o nome do arquivo colocando o path
diff compara conteúdo de 2 arquivos
< 1º arquivo > 2ºarquivo
cmp compara dois arquivos
-s ( echo $? Ætraz 1 se diferente )
 ( echo $? Ætraz 0 se igual )
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
30
Comandos de Impressão
• echo ou print
Escreve argumentos em stdout.
Sintaxe:
 echo [opções] string
 Opções:
•
 -n : não adiciona uma nova linha no stdout antes
de imprimir a string, deixando o cursor na linha
da mensagem escrita. FUNCIONA APENAS
COM PRINT
Notas:
 
•
 echo
 Exemplos:
1. print -n “Entre com a opção desejada => “
 Entre com a opção desejada Î__ 
2. echo “Hoje é dia $dia”
3. echo “Bom dia”
4. echo “Os arquivos são: “ *
5. echo “Essa pessoa $nome eh muito legal” > arq
6. echo * Æ o mesmo que o comando ls *
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
31
Comandos de Impressão
• cat
Concatena e imprime. O comando cat não altera dados,
ele toma a stdin e a reproduz no stdout. Possui também
a opção de varrer o arquivo mas não pára a cada tela
do terminal.
Sintaxe:
cat [opções] stdin
Opções:
•
 
-n
 : lista as linhas do arquivo numerando-as
 file:
Notas:
 
•
 cat
 
 Exemplos:
1. cat capt1 capit2 > livro
 livro irá conter capit1,2
 
2. cat capt3 >> livro
 anexe capit3 no livro
 
3. cat capit1
 lista capit1 no terminal
 
4. cat -n capit1
 lista capit1 numerando as linhas
 
5. cat > arq1
direciona o stdin para o terminal e stdout para arq1, assim
tudo que for digitado será gravado no arq1. Para encerrar
tecle CTRL D.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
32
Comando de Segurança
 
• chmod
Altera a permissão do arquivo.
Sintaxe:
 chmod [quem] operação acesso arquivo
 Opções:
• quem: u(usuário), g(grupo), o(outros), a
(todos)
• operação: +(atribuir), -(remover), =
• acesso: r(read), w(write), x(execução)
• -R : altera a permissão dos arquivos e
diretórios descendetemente.
 
Para tornar um shell script executável, é necessário alterar
a permissão do arquivo.
Comando de Leitura
• read
Direciona o terminal como stdin, ou seja , captura o
que foi digitado no teclado.
Sintaxe:
 read variável
Notas:
•
 chmod
 Se a sua shell for executar o comando FTP você deverá alterar a
permissão do arquivo que contém o usuário e a senha para
somente o dono ler, gravar e executar.
Exemplos:
chmod u=rwx,go= arquivo
 ls -la
 -rwx------ 1 lilliam supsof 110 Sep 25 16:33 arquivo
• Exemplo:
 echo -n “Digite a opcao: “
 read opcao
 if (($opcao > 9)) then
 echo “Opcao Invalida”
 fi
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
33
Comando de Ordenação
 
• sort
Ordena e combina múltiplos arquivos.
Sintaxe:
sort [opções] stdin .....
Opções:
• -b: ignora espaços em branco para encontrar a 1a
ou última coluna do campo
• -d: sorteia usando ordem alfabética. Somente
letras, dígitos e espaços são considerados na
comparação.
• -f: altera todas as letras minúsculas para
maiúsculas antes da comparação.
• -m: junta todos arquivos de entrada num só. Os
arquivos de entrada devem estar sorteados.
• -n: ordena o arquivo numericamente
• -r : ordena o arquivo na forma decrescente
• -u: deleta linhas duplicadas
• -t: define delimitador
• -k [cpo ini.col ini] [opção] [ , cpo fim.col fim]
[opção] : define chave do sort
• -o: especifica que o stdout vai ser o mesmo
arquivo do stdin
Notas:
•
 O comando sort trabalha a nível de caracter, campo ou em uma
combinação dos dois. Caso o arquivo sorteado possua linhas
duplicadas estas podem ser retiradas com uniq. Para tornar mais
eficiente esse comando deve ser utilizado após os dados terem
sido selecionados (grep ou cut).
As opções válidas para a opção -k são: b,d,f,n,r
Valores default para a opção -k:
cpo ini começo da linha
col ini 1a. coluna do campo
cpo fim final da linha
col fim última coluna do campo
Exemplos :
1. sort -nru arquivo
 
2. sort -k2,2f -k3 arquivo
 
3. sort -k1.1 -k2.4 arquivo
 
4. sort -rt’ ‘ -k3b -k4 arquivo
 
5. sort -m arq1 arq2
6. sort -d arq1 -o arq1_sort
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)Programação Shell
34
Comandos de Seleção
• line
Copia uma linha do stdin e grava no stdout.
Sintaxe:
line stdin > stdout
stdin - arquivo
stdout - arquivo ou terminal
• head
Seleciona as 10 primeiras linhas de um arquivo.
Sintaxe:
head [opção] stdin > stdout
Opções:
•
 -c n : seleciona as n primeiras colunas do stdin
•
 -n : seleciona as n primeiras linhas do stdin
 
• tail
Seleciona as 10 linhas finais de um arquivo
Sintaxe:
tail [opções] stdin > stdout
Opções:
•
 -n : seleciona as n últimas linhas do stdin
•
 -f : mostra as linhas que estão sendo
adicionadas no arquivo.
Notas:
head -c3 /etc/passwd
tail -f /var/adm/messages
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
35
Comandos de Seleção
• sed
Edita e altera dados.
Sintaxe:
sed [opções] stdin > stdout
Opções:
•
 -e “script” : edita e altera dados
Onde script pode ser:
“s/string antiga/string nova/g”
“/string pertencente à linha a ser deletada/d”
“s/string a ser deletada//g”
"s/ *$//g" Æ deleta espaço em branco até o fim
 da linha
 1d arquivo Æ deleta a 1ª linha do arquivo
 
•
 
-f arquivo : contém os scripts que devem ser
executados. Não colocá-los entre aspas duplas.
•
 
-n x,zp arquivo : Seleciona da linha "x" até a linha
"z" do arquivo especificado.
.
 - Não usar stdin como stdout
 - Pode ser alterado o delimitador do sed de "/ "
 para qualquer outro caracter "+", "(", "=", etc
Notas:
•
 O comando sed muda a informação dentro de um arquivo ou
tabela. Este comando também deleta linhas de arquivos. Portanto
pode ser utilizado como um programa que atualiza campos ou
deleta linhas.
 Exemplos:
1. sed -e “s/café/chá/g” entrada > entrada_alterada
 Altera a palavra café para chá em todas as ocorrências (g)
2. sed -e “/João/d” entrada > saída
 Deleta todas as linhas do stdin que contém a palavra João
3. sed -e “s/devedor//g” entrada
 Deleta a palavra
4. sed -f arqcom entrada > arqsaida
 Executa os comandos que estão no arquivo arqcom.
 arqcom: s/shell/Shell/g
 s/Terça/terça/ Æ
Æ
 altera 1 ocorrência por linha
OBS: NÃO USAR ASPAS DENTRO DO ARQUIVO
5. sed -e “s/cha/café” -e “s/limao/mate/” arq_sala > arqsaida
6. sed -n 5,10p arquivo
 imprime da linha 5 até a linha 10 do arquivo.
7. nlin=`cat arquivo | wc -l `
lin=1
while (( $nlin <= $lin))
do
sed -n "$lin"p arquivo
 let lin=lin+1
done
Percorre linha a linha do arquivo
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
36
Comandos de Seleção
• uniq
Seleciona apenas uma ocorrência de cada linha do
stdin. Obrigatoriamente stdin deve estar ordenado
(comando sort).
Sintaxe:
uniq [opções] stdin
Opções:
•
 
-u: seleciona linhas únicas
•
 
-c: conta o número de vezes que cada linha se
repete
•
 
-d: seleciona apenas as linhas com mais de uma
ocorrência
• find
Seleciona arquivos, a partir do diretório especificado. É
recursivo.
Sintaxe:
find dir opções
Opções:
•
 
-type: especifica o tipo de arquivo (f, d ou l)
•
 
-name
 : informa o nome do arquivo
•
 
-print: lista os arquivos (incluindo o path) que
satisfazem o critério.
Notas:
Exemplos:
• find . -name "*.HTML" -print Æ lista todos os arquivos que
terminam com .HTML
• find . -type f -print Æ lista todos os arquivos do tipo file a paritir
do diretório corrente (.)
• find /home -type d -print Æ lista todos os arquivos do tipo
diretórioa partir do diretório /home
• find . -name "*.sqb" -print | xargs grep "matr_aluno" | wc -l
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
37
Comandos de Seleção
• grep
Seleciona linhas usando um único critério de seleção.
Sintaxe:
 grep [opções] string stdin
Opções:
•
 
-c
 : conta o nº de vezes que a string aparece.
•
 
-i
 : ignora uppercase
•
 
-l
 : lista somente o nome dos arquivos que contém
a string procurada.
•
 
-n
 : numera linhas que contém a string procurada.
•
 
-v
 : lista todas as linhas do arquivo exceto às que
contem a string.
•
 
^letra
 : lista todas as linhas que iniciem com a
letra ou string.
•
 
-w :
 lista somente as linhas que tem exatamente a
string passada
 
 String pode ser:
•
 $variável
•
 “palavra composta”
•
 palavra
•
 “metacaracteres” (* ? [a-z] )
•
 “stringmetacaracter”
Notas:
•
 O comando grep é a ferramenta principal para extrair informações
de campos de dados, procurar cadeia de caracteres e escrever a
informação em stdout.
 
 Exemplos:
1. grep “Mar*” arquivo
 
2. grep Maria arq*
 
3. grep -l Maria arquiv*
 
4. grep -n Maria arquivo
 
5. grep $variável arquivo
 
6. grep -v “Maria Amélia” arquivo
 
7. grep ”[a-z]” arquivo
 
8. grep ^R arquivo
 
9. grep -c Chico arquivo
10. grep -i maria arquivo
11. ps -ef | grep maria | grep \d Æ não aparece a linha do
grep anterior
 
 
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
38
Comandos de Seleção
• cut
Seleciona colunas.
Sintaxe:
 cut [opções] stdin
 Opções:
•
 -cx-y : define coluna inicial(x) e coluna final(y)
•
 -dCaracter : define delimitador
•
 -fx,y : quais campos serão selecionados
•
 -s : suprimi linhas que não contém delimitador.
Somente pode ser usado junto com a opção -d
OBS: O comando cut opera em colunas
• wc
Conta linhas, palavras e caracteres de arquivos.
Sintaxe:
wc [opções] stdin
Opções:
•
 -c: conta caracteres
•
 -l : conta linhas
•
 -w: conta palavras
Notas:
•
 O comando cut corta arquivos em colunas. Também pode operar
em cada caractere ou campo, ou alguma combinação de ambos.
Quando o arquivo tem algum separador entre campos você pode
selecioná-los através de cut.
 
 Exemplos:
1. cut -f1,5 -d: arquivo
 
2. cut -c1-72 arquivo
 
3. cut -d: -s -f3,5 arquivo
OBS: Não é permitido o uso da opção -c junto com a opção -d.
•
 wc
 
 Exemplos:
1. grep -l Maria arqu* | wc -l
 
2. cat arq l wc -l
 
 
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
39
Comandos de Seleção
• split
Divide o stdin em arquivos menores contendo um
número específico de linhas .
Sintaxe:
split [opções] stdin [prefixo]
 Opções:
•
 - qtd. linhas: especifica o nº de linhas de cada
arquivo de saída. Default 1000 linhas por
arquivo.
•
 prefixo: prefixo dos stdouts criados. O sufixo é
aa,ab até zz. Default prefixo é x.
 
Notas:
•
 O comando split cria o nome do 1º arquivo do output
combinando o prefixo mais o sufixo aa, ab (p/ o 2º) até zz.
 Exemplo:
1. split -10 arquivo (gera arquivos xaa, xab, …) cada um
contendo 10 linhas
 
2. split -5 arquivo capit (gera arquivos capitaa, capitab,…)
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
40
Comandos de Seleção
• csplit
Separa os arquivos sempre que encontrar uma
combinação entre seus argumentos e o conteúdo do
arquivo. Não funciona no FreeBSD
Sintaxe:
 csplit [opções] stdin [argumentos]
Opções:
•
 -f prefixo: prefixo dos stdouts criados. O sufixo é
00,01 até 99. Default xx
•
 argumentos:
•
 “/argn/” : cria um arquivo por argumento
(inclusive). O arquivo prefixo00 contém as linhas
anteriores ao 1º argumento.
•
 “%arg%” : cria um arquivo contendoos dados a
partir do argumento.
•
 -k: não desfaz a criação dos stdouts caso o no.
de stdouts especificado seja maior que o qtd de
stdin
Notas:
•
 csplit
 
 Exemplos:
•
 O arquivo livro contém:
 Introdução,
 Capitulo1,
 Capítulo 2,
 Resumo.
 
1. csplit -f capit livro “/Capitulo /” “/Capitulo /”
 resultado: capit00 (contém Introdução)
capit01 (contém Capítulo 1)
capit02 (contém Capítulo2 e Resumo)
2. csplit -f capit livro “%Capitulo 1%”
 resultado: capit00 (contém Capítulo 1 Capítulo 2 e
Resumo)
3. csplit livro “/Capitulo 1/”
 resultado: capit00 (contém Introdução)
capit01 (contém Capítulo 1, 2 e Resumo)
4. csplit -k livro “/Capitulo /” (9)
 resultado: será criado até 10 stdout
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
41
Comandos de Transformação
• tr
Transforma caracter por caracter.
Sintaxe:
tr ‘caracter velha‘ ‘caracter nova‘ stdin > stdout
o comando TR é melhor que o DD, quando for converter
strings.
• dd
Converte e copia arquivo.
Sintaxe:
 dd if=stdin of=stdout conv=[opções conv]
 Opções do conv:
•
 lcase: converte arquivo para minúsculo
•
 ucase: converte arquivo para maiúsculo
•
 ascii: converte ebcdic para ascii
•
 ebcdic: converte ascii para ebcdic
•
 ibm: converte ascii to versão ebcdic da IBM
Não aceita passar path
• sed
Visto anteriormente.
Notas:
•
 O comando tr traduz os dados de entrada caractere por
caractere, com base em tabelas de conversão (string)
especificadas pelo usuário.
 Exemplos:
1. tr ‘(A-Z)’ ‘(a-z)’ arq1 > arq1min
 
2. tr ‘(:)’ ‘(\t)’ cad1 > cad1t
3. for file in `ls`
do
mv $file `echo $file | tr ‘(A-Z)’ ‘(a-z)’ `
echo $file
done
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
42
Comandos de Junção
 
• join
Junta dois arquivos, combinando linha a linha. Os
arquivos devem estar ordenados (comando sort).
Sintaxe:
join [opções] arquivo1 arquivo2
 
Opções:
• -tCaracter: define delimitador
• -a nº arquivo: produz uma linha de saída para
cada linha do arquivo especificado pelo nº
arquivo, mesmo para os campos do join que não
casam com nenhuma linha do outro arquivo de
entrada.
• -o nºarquivo.campo : As linhas de saída são
compostas pela lista dos campos especificados na
variável nºarquivo.campo. Para definir mais
campos separe-os por branco ou vírgula
• -1 campo ou -2 campo : Faz o join de 2 arquivos
usando o campo especificado na variável campo
do arquivo 1 (-1) ou arquivo 2 (-2).
• -e string: altera campos em branco do output pela
string especificada
 
 
 
 
Notas:
•
 Quando o join encontra registros que se combinam nos 2
arquivos de entrada ele cria um único registro contendo algum ou
todos os campos dos dois registros. Para utilizá-lo, os dois
arquivos devem estar ordenados (utilize sort).
 Exemplos:
arquivo1: Aldo:HC arquivo2: Aldo:enfermeiro:7234
 Bruno:IMECC João:digitador:7111
 João:CCUEC Ricardo:médico:7323
 
1. join -t: arquivo1 arquivo2
 
2. join -a1-t: arquivo1 arquivo2 > arqsaida
 arqsaida: Aldo:HC:enfermeiro:7234
 Bruno:IMECC:__________
 João:CCUEC:digitador:7111
 
3. join -o 1.1 1.2 2.3 -t”:” arquivo1 arquivo2
 arqsaída: Aldo:HC:7234
 João:CCUEC:7111
 
4. join -1 2 -2 2 arquivo1 arquivo2
OBS:
 Obrigatoriamente a opção -a tem que vir antes da opção -t.
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
43
Comandos de Junção
• paste
Anexa múltiplos arquivos coluna por coluna.
Sintaxe:
 paste [opções] stdin1 stdin2
Opções:
•
 
-dCaracter: define delimitador
•
 
-s
 : junta linhas subsequentes do arquivo
Notas:
Exemplos:
1. paste -d “/” arq1 arq2
Aldo:HC/Aldo:enfermeiro
Bruno:Imecc/Ivo:digitador
2. paste -s -d “/” arq1 arq2
Aldo:HC/Bruno:Imecc
Aldo:Enfermeiro/João:digitador
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
44
Comandos de Junção
• awk
Linguagem de processamento e procura de padrões.
Encontra linha(s) no(s) arquivo(s) de entrada que
combinam com um padrão especificado e então executa
as ações definidas.
Sintaxe:
awk [opções] '/padrão/' {ação} stdin
Opções:
•
 -Fcaracter: define delimitador
A ação pode ser:
 -f pgm: arquivo que contém as ações a serem
 executadas pelo comando awk.
 ‘pgm’: são as ações a serem executadas pelo
 awk.
Notas:
Exemplos:
1. awk -F: ‘{print $5 $1}’ arq_fun
 
2. awk -F: ‘{print $2 “ “ $1}’ arq_fun
 
3. awk -F: {‘$1 ~/e|a/’} arq_fun
 
4. awk -F: ‘{print NR,NF,$0}’ arq_fun
 
5. awk -F: ‘{print $1 > “matr“; print $2 > “nome”}’ arq_fun
 
6. awk -F: ‘{printf “%15s %10s\n”, $1, $3}’ arq1
 
7. awk -F: ‘/smith+ern/’ arq1
 
8. awk -F: ‘/amel??/’ arq_fun
 
9. awk -F: ‘{printf (“meu nome eh %s e meu ramal %5d\n “ ,
$2,$4)} arq_fun
 
10. awk -F: ‘$3 ~/Oct/ {print $2 $3} ‘ arq1
11. awk 'NR == '$cont' {print $0} ' arq Æ le linha por linha de
um arquivo
12. awk ($1 == " '$var' ") [print $0}' arq
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
45
Comandos de Junção
• AWK (Cont.)
Tipos de padrões de pesquisa:
 
•
 
‘/string/’ : grava em stdout todas as linhas do stdin que
contém pelo menos uma ocorrência da string.
 
•
 
‘/string1+string2/’ : grava em stdout as linhas que
contém a string1 seguido por um ou mais caracteres
que precede o sinal de + e termina com a string2.
 
•
 
‘/string1?/’ : grava em stdout as linhas que contém a
string1 seguido por nenhum ou um caracter que
precede o sinal ?
 
•
 
‘/string1|string2/’ : grava em stdout as linhas que
contém a string1 e/ou a string2.
 
•
 
‘/string1[char1-char2]/’ : grava em stdout as linhas
que contém a string1 seguido por qualquer caracter
que esteja entre char1 e char2 inclusive (char1 e char2
devem estar em ordem)
 
•
 
‘/string1[\^char1-char2]/’ : grava em stdout as linhas
que contém a string1 seguido por qualquer caracter
que não esteja entre char1 e char2 inclusive (char1 e
char2 devem estar em ordem).
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
46
Comandos de Junção
• AWK (Cont.)
 
•
 
‘$1 ~/char1/’ : grava em stdout todos os registros que
contém no 1º campo o caracter char1 ou uma string .
 
•
 
‘$1 ~/^char1/’ : grava em stdout todos os registros que
não contém no 1º campo o caracter char1 ou uma
string.
 
•
 
‘$2 ~/char1$/’ : grava em stdout todos os registros que
contém o último caracter igual a char1 ou string.
 
•
 
‘$1 == “string1” ‘ : grava em stdout todos os registros
que contém o 1º campo igual à string1
 
•
 
‘$1 >= “char1” ‘ : grava em stdout todos os registros
que o 1º campo é maior ou igual a char1
 
•
 
‘$1 == “string1” && $2 == “string2” ‘ : grava em
stdout todos os registros que o 1º campo é igual a
string1 e o 2º é igual a string2.”
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
47
Comandos de Junção
• AWK (Cont.)
Tipos de ações:
∗
 Output:
Impressão de campos, variáveis e constantes:
‘{ print $1 “ “ $2}’ : grava em stdout o campo 1 e
campo 2 separados por um espaço em branco.
Redirecionamento:
‘{ print $1 > “arqoutput”} ‘ : redireciona o campo 1 para o
stdout arqoutput .
 
Instruções aritméticas:
‘{ print $1 *= $2 } ‘ :o campo 1 é o resultado da
multiplicação do campo1 com o campo2.
 
‘{print “ra” , $1 “média :” , $2 / $3 } ‘
 : 
 grava em stdout
o campo 1 precedido da string ra e a string média é o
resultado da divisão do campo $2 pelo campo $3 .
 
Variáveis Especiais:
‘{ print NR, $0 } ‘ : grava em stdout os registros de stdin
numerado.
 
Notas:
sequencia significado
\n nova linha
\b backspace
\t tab
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
48
Comandos de Junção
• AWK (Cont.)
Concatenação de campos:
‘{ print $1 = $1 $2}' : o campo 1 é a concatenação do
campo 1 com campo 2
Imprimir linha em branco:
‘{print “ “} ‘
Impressão formatada de campos variáveis ou
constantes :
‘{printf “%15s\n” , $1}’ : imprime o campo 1 por linha
formatando-o utilizando 15 posições alinhado à direita.
‘{printf “%20d %-5s\n”, $3+$2 , $1}’ : imprime o
resultado da soma do campo2 e do campo3 e o campo
1.
‘{printf “%20s %4d\n” , “NOME” , RAMAL”}’ imprime
as constantes NOME e RAMAL no formato definido
pelo printf.
Notas:
•
 Tabela de caracteres de controle para o printf
caracter expressão
c caracter ASC II
d decimal inteiro
e [-] d.dddddd [+-] dd
f [-] ddd.dddddd
s string
% imprime %
•
 Formatos válidos para o printf:
Fmt $1 printf ‘{fmt, $1}’
%c 97 a
%d 97.5 97
%5d 97.5 bbb97
%e 97.5 9.750000e+01
%f 97.5 97.500000
%7.2f 97.5 97.50
%06d 97 000097
|%s| Janeiro |Janeiro|
|%10s| Janeiro | Janeiro|
|%-10s| Janeiro |Janeiro |
|%.3s| Janeiro |Jan|
|%10.3s| Janeiro | Jan|
|%-10.3s| Janeiro |Jan |
%% Janeiro %
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
49
Comandos de Junção
• AWK (Cont.)
∗
 Begin
 
 Ações que devem ser executadas antes do stdin ser lido.
Na execução de mais de uma ação ela deve estar entre
colchetes.
 
BEGIN { FS = “:”
printf (“%20s %5s\n” , “NOME” , “RAMAL”) }
{ printf (“%20s %5s\n”, $2 , $1) }
∗
 End
Ações que devem ser executadas após o stdin ser lido.
Se for executar mais de uma ação ela deve estar entre
colchetes.
 
 END { printf ("%20s" , "fim de relatório ") }
 END { print "fim de relatório" }
 
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
50
Comandos de Junção
• AWK (Cont.)
∗
 Instruções condicionais:
 
 if (expressão) {ações} [else {ações} ]
 while (expressão) {ações}
 
 BEGIN { FS = “:” }
 if ($1 != prev {
 print “ “
 prev = $1
 }
∗
 Variáveis especiais:
NR: número da linha corrente
NF: quantidade de campos da linha
FS = “caracter”: define delimitador
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
51
Date
Algumas opções de date:
♦ `date +%a` => Tue ; `date +%A` => Tuesday
♦ `date +%b` => Sep ; `date +%B` => September
♦ `date +%c` => Tue Mar 31 15:58:44 2000
♦ `date +%d` => 31 (com 0 ex: 01)
♦ `date +%e` => 31 (sem 0 ex: 1)
♦ `date +%D` => 09/31/00(mês/dia/ano)
♦ `date +%j` => 254 (dia do ano)
♦ `date +%m` => 03
♦ `date +%p` => PM
♦ `date +%U` => 36 (no. da semana)
♦ `date +%y` => 00 (ano)
♦ data= `date +%d-%m-%Y` => 22-02-2000
♦ hora=`date +%H%M%S`
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
52
Dicas de programação
1. Se a sua shell for fazer FTP, alterar a permissão do
arquivo que contém o usário e a senha para “700”. Este
é um ítem obrigatório por medidas de segurança.
 
2. Cada sistema tem um usário para acessar o IBM
(mainframe) via FTP. Se o objetivo deste ftp é acessar
alguma visão DB2, deverá ser solicitado ao DBA
autorização para acesso às visões.
 
3. Utilize filtros de redução, grep, cut e awk em primeiro
lugar em um conduto, reduzindo a quantidade dos dados
que deverão ser transferidos pelo Shell.
 Exemplo: grep $1 arq1 | sort
 
4. Utilize condutos ao invés de arquivos temporários para
melhorar a eficiência da sua shell
 Com arquivo temporário: 
 cut -f1,5 arq1 > /tmp/arq1tmp
 sort /tmp/arq1tmp
 rm /tmp/arq1tmp
 Com conduto: cut -f1,f5 arq1 | sort
 
5. Qualquer programa Shell com mais de duas páginas é
muito complexo.
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
53
Dicas de programação
6. Sempre utilize delimitador de campos nos arquivos. O
delimitador deve ser único e simples e deve ser
utilizado entre colunas.
 
7. Utilize delimitador único e diferente para subcampos,
como por exemplo data (dia/mês/ano).
 
8. Organize os dados para maior eficiência da máquina:
primeiro chaves primárias, depois chaves secundárias e
depois os itens de dados.
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
54
Executar comandos vi em modo batch
• Utilizando o editor vi:
vi arquivo < comandos_vi >/dev/null
Comandos_vi:
 /FIM
 dd
 ^[
 :x
Notas:
• vi
♦ Se o arquivo existir, touch atualiza a data do arquivo, se não
existir touch cria o arquivo
♦ echo, escreve no stdout, no caso no arquivo criado por touch
♦ ^[ - representa a tecla ESC (digitar CTRL v CTRL [ )
♦ :x - sai do editor vi e salva o arquivo
♦ vi abre o arquivo e executa os comandos gravados no arquivo
comandos_vi
♦ >&! /dev/null - se a execução do vi der algum erro ele joga
fora as mensagens de erro
• ed
♦ editor ed executa os comandos definidos abaixo dele até
encontrar o delimitador, neste exemplo, EOF!
♦ s - substitui
♦ g - global
♦ w - salva as alterações no arquivo aberto por ed
♦ q - sai do editor ed
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuec.unicamp.br)
Programação Shell
55
Como utilizar ISQL num SHELL
• /usr/informix/bin/isql -s bgql01 -qr delvtab53 > \
logerror_delete
• /usr/informix/bin/isql
Path do isql
• -s bgql01
Banco de dados que está a visão/relação que
será acessada.
• -qr
Opções do isql que serão executadas. No caso,
q (query) e r(run)
• delvtab53
Arquivo que contém os comandos isql
• \
Continuação da linha comando
• logerror_delete
Se ocorrer algum erro, será gravado neste
arquivo
Notas:
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
56
R E F E R Ê N C I A S
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
57
Comandos básicos do vi:
INICIANDO O VI
vi filename abre ou cria um arquivo
vi +18 filename abre o arquivo na linha 18
vi +/”teste” filename abre o arquivo na 1a. ocorrência de “teste”
view filename abre o arquivo somente para leitura
COMANDOS DE CURSOR
h move à esquerda
j move para baixo
k move para cima
l move à direita
w move uma palavra à direita
W move uma palavra à direita (além da pontuação)
b move uma palavra à esquerda
B move uma palavra à esquerda (além da pontuação)
Return move uma linha abaixo
Back Space move um caracter à esquerda
Space Bar move um caracter à direita
H move para o início da tela
M move para o meio da tela
L move para o fim da tela
Ctrl-F avança uma tela
Ctrl-D avança meia tela
Ctrl-B retorna uma tela
Ctrl-U retorna meia tela
: vai para a 1ª linha do arquivo
:$ vai para a última linha do arquivo
INSERINDO CARACTER E LINHAS
a insere caracter à direita do cursor
A insere caracter à direita do cursor e sinaliza fim de inha
I insere caracter à esquerdado cursor
I insere caracter à esquerda do cursor e sinaliza fim de inha
o insere linha abaixo do cursor
O insere linha acima do cursor
ALTERANDO O TEXTO
cw altera palavra ( ou parte da palavra à direita do cursor)
cc altera linha
C altera parte da linha à direita do cursor
s substitui a string onde o cursor está posicionado
r repete string que o cursor está com um outro caracter
r-Return para linha
J junta a linha corrente com a linha acima
xp muda o caracter que o cursor está posicionado com o
caracter à direita
- altera letra (upper ou lower)
u desfaz o comando anterior
U desfaz todas as alterações da linha
:u desfaz o comando anterior da última linha
DELETANDO TEXTO
x deleta caracter
dw deleta palavra (ou parte da palavra à direita do cursor)
dd deleta linha
D deleta parte da linha à direita do cursor
:5,10 d deleta da linha 5 à linha 10
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
58
COPIANDO OU MOVENDO TEXTO
yy ou Y marca linha a ser copiada
p copia a linha marcada abaixo da linha corrente
P copia a linha marcada acima da linha corrente
dd deleta linha (em vez de mover)
:1,2 co 3 copia as linhas 1-2 e coloca-as depois da linha 3
:4,5 m 10 move as linhas 4-5 e coloca-as depois da linha 10
SETANDO LINHA NUMERADA
:set nu mostra as linhas numeradas
:set nonu inibe a numeração das linhas
PROCURANDO UMA LINHA
G vai para a última linha do arquivo
21G vai para a linha 21
? busca de traz para diante
PROCURANDO E ALTERANDO
/string/ procura a string
?string? procura a string no texto acima
n procura a próxima ocorrência da string
:g/search-string/s//replace-string/gc
procura e altera, consultando antes de cada ocorrência
:%s/string_velha/string_nova/g
troca string_velha pela string_nova
:g/....$/s/// deleta as 4 últimas posições
:g/^$/d deleta linha em branco
:g/^Capit [0-9]$/g .w >> stdout
grava no arquivo todas as linhas que contenham a string
"Capit" seguida de espaço em branco e 1 algarismo
variando de 1 a 9
:g/^Capit [0-9]$/ . copy $
a mesma pesquisa, porem serão copiadas para o final do
arquivo
:g/string/d procura a string e deleta
:%s/string velha/string nova/g
:%s/^h.t$/host substitui palavra que começa com h e termina com t
LIMPANDO A TELA
Ctrl L limpa a tela
INSERINDO UM ARQUIVO NUM ARQUIVO
:r filename insere o arquivo depois do cursor
:34 r filename insere o arquivo após a linha 34
SALVANDO E CANCELANDO
:w ou :x salva as alterações (no buffer)
:w filename grava o buffer no arquivo
:wq ou :zz salva as alterações e sai do vi
:q! sai do vi sem salvar as alterações
arq .exrc
ab vc - Vocabulary
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
59
Í N D I C E
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
60
O QUE É SHELL ?.............................................................................................. 2
QUANDO USAR ................................................................................................... 3
PRODUTIVIDADE ............................................................................................... 4
FILTROS............................................................................................................... 5
REDIRECIONAMENTO...................................................................................... 6
CONDUTO............................................................................................................ 7
CONSTRUÇÃO DE UM SHELL SCRIPT .......................................................... 8
CARACTERES ESPECIAIS DO SHELL............................................................ 9
TIPO DE VARIÁVEIS........................................................................................ 11
• GLOBAL: .................................................................................................... 11
• LOCAL:....................................................................................................... 11
DEFINIÇÃO DE VARIÁVEIS ........................................................................... 12
• STRING....................................................................................................... 12
• STRING....................................................................................................... 13
• INTEIRO...................................................................................................... 14
• ARRAY ....................................................................................................... 15
EDIÇÃO DE STRING ........................................................................................ 16
• TYPESET ..................................................................................................... 16
TRATAMENTO DE VARIÁVEIS ..................................................................... 17
• TESTA SE A VARIÁVEL TEM CONTEÚDO.......................................................... 17
TRATAMENTO DE ERRO ............................................................................... 18
• $? - TESTA SE O COMANDO FOI EXECUTADO COM SUCESSO. ............................ 18
VARIÁVEIS DE AMBIENTE ............................................................................ 19
EXECUÇÃO DE UM SHELL SCRIPT.............................................................. 20
TRATAMENTO DE PARÂMETROS ............................................................... 21
PRINCIPAIS OPERADORES ............................................................................ 22
OPERADORES DE TESTE ............................................................................... 23
COMANDOS CONDICIONAIS......................................................................... 24
• IF - THEN - ELSE .......................................................................................... 24
• CASE .......................................................................................................... 25
• FOR ............................................................................................................ 26
• WHILE ........................................................................................................ 27
COMANDOS DO SHELL .................................................................................. 28
COMANDOS DE IMPRESSÃO......................................................................... 30
• ECHO OU PRINT ........................................................................................... 30
• CAT ............................................................................................................ 31
COMANDO DE SEGURANÇA.......................................................................... 32
• CHMOD....................................................................................................... 32
COMANDO DE LEITURA ................................................................................ 32
• READ.......................................................................................................... 32
COMANDO DE ORDENAÇÃO......................................................................... 33
• SORT .......................................................................................................... 33
COMANDOS DE SELEÇÃO ............................................................................. 34
• LINE ........................................................................................................... 34
• HEAD.......................................................................................................... 34
• TAIL ...........................................................................................................34
COMANDOS DE SELEÇÃO ............................................................................. 35
• SED ............................................................................................................ 35
• UNIQ........................................................................................................... 36
• FIND ........................................................................................................... 36
• GREP .......................................................................................................... 37
• CUT ............................................................................................................ 38
Centro de Computação - Unicamp
Gerência de Atendimento ao Cliente (e-mail:apoio@ccuecunicamp.br)
Programação Shell
61
• WC ............................................................................................................. 38
• SPLIT .......................................................................................................... 39
• CSPLIT ........................................................................................................ 40
COMANDOS DE TRANSFORMAÇÃO............................................................ 41
• TR .............................................................................................................. 41
• DD.............................................................................................................. 41
• SED ............................................................................................................ 41
COMANDOS DE JUNÇÃO................................................................................ 42
• JOIN............................................................................................................ 42
• PASTE ......................................................................................................... 43
• AWK........................................................................................................... 44
DATE................................................................................................................... 51
DICAS DE PROGRAMAÇÃO ........................................................................... 52
EXECUTAR COMANDOS VI EM MODO BATCH ........................................ 54
COMO UTILIZAR ISQL NUM SHELL ........................................................... 55
COMANDOS BÁSICOS DO VI:........................................................................ 57

Outros materiais