Sunteți pe pagina 1din 88

Korn Shell Script Treinamento bsico em programao

2


Korn Shell Script Treinamento bsico em programao
3


Korn Shell-Script - Treinamento bsico em programao

Mdulo 1 - O que o Shell _________________________________________________ 9
Intrnsecos do Shell x comandos do Unix _________________________________________ 10
Shells comumente usados______________________________________________________ 10
Caractersticas do Korn Shell __________________________________________________ 11
O uso de alias _______________________________________________________________ 11
Edio da linha de comando ___________________________________________________ 11
Ambiente do usurio _________________________________________________________ 12
Configurando variveis do Shell ________________________________________________ 12
Duas variveis importantes PATH e TERM_______________________________________ 12
Exerccios___________________________________________________________________ 13
Mdulo 2 - Capacidades de substituio do Shell ______________________________ 14
Armazenamento das variveis do Shell __________________________________________ 15
Inicializao e deleo de variveis do Shell ______________________________________ 15
Substituio de variveis ______________________________________________________ 15
Substituio de comando ______________________________________________________ 16
Substituio do ~ (til) _________________________________________________________ 17
Exerccios___________________________________________________________________ 18
Mdulo 3 - Introduo ao Quoting__________________________________________ 19
Caracteres usados no mecanismo de Quoting _____________________________________ 20
Quoting Barra Invertida - \ ____________________________________________________ 20
Quoting Aspa Simples - ' _____________________________________________________ 20
Quoting Aspa Dupla - " _______________________________________________________ 21
Exerccios___________________________________________________________________ 22
Mdulo 4 - O que um script-Shell _________________________________________ 23
Exemplo de programa Shell____________________________________________________ 24
Comentrios em um programa Shell ____________________________________________ 24
Exemplo de documentao de Shell Script________________________________________ 24
Passando dados para um programa Shell ________________________________________ 26
Parmetros posicionais________________________________________________________ 26
Variveis especiais do Shell - # e * ______________________________________________ 27
O comando shift ___________________________________________________________ 28
O comando read ____________________________________________________________ 28
Korn Shell Script Treinamento bsico em programao
4


O comando echo e os caracteres de sada ________________________________________ 29
Escrevendo funes no Shell ___________________________________________________ 30
Tcnicas adicionais de programao ____________________________________________ 31
Exerccios___________________________________________________________________ 32
Mdulo 5 - Cdigos de retorno e a varivel ? _________________________________ 33
Avaliando expresses - test ou [ ]__________________________________________ 34
Testes numricos_____________________________________________________________ 34
Testes de string ______________________________________________________________ 35
Comparao numrica x comparao de strings___________________________________ 35
Teste de arquivos ____________________________________________________________ 36
Operadores booleanos para o comando test_____________________________________ 36
Comandos exit e return ____________________________________________________ 37
Desvio condicional - a construo if/else ______________________________________ 38
Desvio condicional - a construo if/elif/else ________________________________ 38
Desvio condicional - a construo case__________________________________________ 39
Exerccios___________________________________________________________________ 41
Mdulo 6 - Repetindo a execuo de um grupo de comandos (looping) ____________ 42
Avaliao aritmtica - comando let ou (( )). _________________________________ 43
Executando enquanto a condio verdadeira - while ____________________________ 44
Mais exemplos de uso da construo while ______________________________________ 44
Executando at que a construo seja verdadeira - until __________________________ 45
Mais exemplos de uso da construo until ______________________________________ 46
Executando grupos de comandos atravs de uma lista - for_________________________ 46
Montando um menu com opes autonumeradas - select _________________________ 47
Alterando a seqncia de execuo de um loop - break e continue_________________ 49
Exemplo do uso de break e continue _________________________________________ 49
Exerccios___________________________________________________________________ 50
Mdulo 7 - Conceito de sinais______________________________________________ 51
O que uma TRAP?__________________________________________________________ 52
O comando trap ____________________________________________________________ 52
Ignorando sinais _____________________________________________________________ 53
Localizao do comando trap _________________________________________________ 53
Exerccio ___________________________________________________________________ 54
Mdulo 8 - Uma pequena introduo linguagem AWK ________________________ 55
Korn Shell Script Treinamento bsico em programao
5


Encontrando todos os padres procurados em uma linha. ___________________________ 56
Mais exemplos de uso da linguagem AWK e suas declaraes________________________ 56
Arquivos de dados usados nos exemplos _________________________________________ 56
Arquivo BBS-list________________________________________________________________ 56
Arquivo inventory-shipped _____________________________________________________ 57
Iniciando com o awk__________________________________________________________ 57
Como so executados os programas awk _________________________________________ 58
Um exemplo bastante simples __________________________________________________ 58
Um exemplo com duas regras de pesquisa ________________________________________ 58
Programas awk executveis____________________________________________________ 59
Mdulo 9 - Comandos do Unix teis para a programao script-Shell _____________ 61
Obtendo o comprimento de uma string - ${#VARIVEL}__________________________ 61
Extraindo sub-cadeias de caracteres de uma string - expr substr__________________ 61
Removendo espaos em branco - tr -s " " ____________________________________ 63
Trocando as letras - tr "[a-z]" "[A-Z]" e tr "[A-Z]" "[a-z]"____________ 63
Colocando o cursor em uma determinada posio - tput cup ______________________ 64
Definindo um formato de sada para os dados - comando printf____________________ 65
Alinhando strings direita ou esquerda______________________________________________ 65
Preenchendo strings com zeros esquerda ____________________________________________ 66
Efetuando uma pausa no processamento do script - sleep _________________________ 67
Mdulo 10 - Exemplos de Scripts-Shell teis __________________________________ 68
Limitando a quantidade de sesses simultneas dos usurios - unico_login.sh______ 68
Calculando a diferena entre intervalos de tempo - diftempo.sh __________________ 69
Pontuando valores maiores que 999 - pontuar.sh _______________________________ 72
Cadastro de scripts Shell desenvolvidos - utilitarios.sh _______________________ 75
Agenda de contatos e/ou ramais internos - agenda.sh ____________________________ 77
Apndice A - Endereos Internet referentes a Unix ____________________________ 78
Apndice B - Referncia de comandos Unix teis em scripts _____________________ 79
bc - Calculadora binria ______________________________________________________ 79
cut - Exibio de campos ou colunas____________________________________________ 80
expr length - Retorna o tamanho de uma string ______________________________ 81
expr substr - Exibe partes de uma string____________________________________ 82
printf - Exibe dados (strings ou numricos) formatados ________________________ 83
set -u/+u - Ativa ou desativa o uso de variveis no existentes ____________________ 84
sleep - Faz uma pausa em segundos____________________________________________ 84
Korn Shell Script Treinamento bsico em programao
6


tput cup - Posicionamento do cursor em tela _________________________________ 85
tput ed - Limpa at o final da tela_____________________________________________ 85
tput el - Limpa at o final da linha ___________________________________________ 85
tput blink - Coloca o cursor em modo piscante_________________________________ 86
tput bold - Coloca o cursor em modo negrito___________________________________ 86
tput smso - Ativa o modo vdeo reverso________________________________________ 86
tput rmso - Desativa o modo vdeo reverso _____________________________________ 87
tr -s " " - Remove o excesso de espaos _____________________________________ 87
tr "[a-z]" "[A-Z]" - Converte caracteres em maisculas ______________________ 87

Korn Shell Script Treinamento bsico em programao
7


Korn Shell Script Treinamento bsico em programao
9


Mdulo 1 - O que o Shell
O Korn Shell (KSH) um programa interativo que serve como interpretador de linha de comando. Ele
pesquisa por um comando e executa o programa a ele associado, substitui os valores das variveis do KSH
pelo contedo a ela associado, executa substituio de comandos, completa nomes de arquivos a partir de
caracteres de gerao de nomes de arquivos, manipula redirecionamento de entrada, sada e pipelines. Ele
responsvel pela interface entre o usurio e o sistema operacional, traduzindo os comandos por ele digitados
para o hardware executar.
O Shell contm uma interface de programao interpretada, incluindo testes, desvios e loops. Aos programas
criados usando a interface programada do Unix damos o nome de Shell-Scripts ou, simplesmente, Scripts.
Korn Shell Script Treinamento bsico em programao
10


Intrnsecos do Shell x comandos do Unix
Intrnsecos so comandos construdos (residentes) no prprio interpretador KSH, tambm conhecidos como
comandos built-in:
set, while, if, case, for, test, alias, exec, entre outros.
Os comandos do Unix geralmente so localizados no diretrio /usr/bin.
Os comandos transientes, isto aqueles que no so built-in, so encontrados pelo KSH atravs da varivel
PATH.
Tanto os nomes de comandos do Unix quanto os intrnsecos no devem ser usados como nomes dos scripts
criados pois esses so palavras reservadas do Unix, devendo ser evitados incondicionalmente.
Shells comumente usados
Embora possam existir vrios tipos de Shell no Unix, este material ir cobrir o Korn Shell, um padro
internacional de Shell para os ambientes Unix que seguem as especificaes determinadas pela interface
POSIX, criada pelo IEEE (Institute of Electrical and Electronic Engeneers), interface esta que padroniza as
vrias plataformas Unix e que permite a excelente portabilidade dos programas desenvolvidos em Shell-
Script. Para sua informao, abaixo so citados os interpretadores de comandos mais comuns, sua descrio e
o prompt que eles possuem quando em linha de comando.:

Shell Tipo Prompt
============= ========== =====
/usr/bin/ksh Korn Shell $
/usr/bin/csh C Shell %

Existem tambm os Shells restritos, que limitam a ao do usurio no ambiente Shell.


Korn Shell Script Treinamento bsico em programao
11


Caractersticas do Korn Shell
O Korn Shell possui vrias caractersticas, mas as destacadas aqui so as mais importantes para o
entendimento da programao Shell:
Uso de alias (apelido) para os comandos
Recuperao e edio da linha de comando
Capacidades avanadas no uso do comando cd
Capacidade de programao avanada
O uso de alias
Alias um novo nome, ou apelido, para o comando. Para conseguir isso usa-se o comando alias.
Sintaxe: alias nome=string
Pode ser usado para abreviar longas linhas de comando ou fazer com que comandos comportem-se de
maneira diferente da execuo padro.
Se string contiver espaos, dever ser digitada entre aspas.
Os aliases definidos possuem prioridade de execuo em relao aos comandos do Unix. Quando atribudo
interativamente, ficar ativo at o logout da sesso de terminal. Para que um alias esteja disponvel no
momento do logon, deve-se coloc-lo no arquivo /etc/profile (caso queira que os alias estejam
disponveis para todos que se logarem), no arquivo .profile no diretrio de login do usurio (ficando
disponvel somente para o usurio logado) ou no arquivo .kshrc, criado no diretrio de login do usurio.
Exemplos:

alias cls=clear
alias ls='ls logt'
alias lsf='ls laF'
alias rm='rm i'
alias del='rm f'
alias dir=ls
Edio da linha de comando
O Korn Shell permite a recuperao da ltima linha de comando para ser executada.
Usando os comandos do editor de textos vi a linha poder ser editada antes da execuo.
Para ativar o recurso, dever ser executado o seguinte comando:
set o vi
Para que este recurso seja atribudo automaticamente no momento do logon, coloque o comando acima em
seu arquivo $HOME/.profile ou $HOME/.kshrc.

Korn Shell Script Treinamento bsico em programao
12


Ambiente do usurio
O ambiente do usurio descreve a sesso para o sistema, contendo as seguintes informaes, geralmente
armazenadas em variveis de ambiente:
caminho para o diretrio home - varivel HOME
onde enviar seu correio eletrnico - varivel MAIL
fuso horrio no qual voc est trabalhando - varivel TZ
com que nome voc se logou - varivel LOGNAME
onde seu Shell pesquisar os comandos - varivel PATH
seu tipo de terminal - varivel TERM
outras definies que seus aplicativos possam precisar
Muitos aplicativos necessitam que o ambiente seja customizado de alguma maneira. Isso feito atravs da
modificao do arquivo $HOME/.profile do usurio. Para que a customizao valha de maneira geral,
isso deve ser definido no arquivo /etc/profile. Vale lembrar que o arquivo /etc/profile s pode
ser manipulado pelo administrador do sistema operacional - usurio root - ou outro usurio com permisses
para fazer manuteno nesse arquivo.
Configurando variveis do Shell
Variveis do Shell so atribudas da seguinte maneira:
NOME_DA_VARIAVEL=contedo
Isto pode ser digitado como uma linha de comando ou em uma linha de um programa Shell-script. No deve
haver espao antes ou depois do sinal de igual. Isso assegura que a atribuio seja feita corretamente, no
sendo interpretada como um comando com argumentos separados por espaos.
Duas variveis importantes PATH e TERM
PATH relao de diretrios, usada pelo Shell para a pesquisa de comandos. Os diretrios a serem
pesquisados devem estar separados por dois pontos (:). Para que um comando existente no
diretrio corrente seja executado pelo nome, coloque o diretrio corrente (.) na varivel
PATH. Exemplo:
export PATH=/usr/bin:/etc:/bin:/home/user1:.
TERM descreve o tipo de terminal. Deve ser atribudo um valor de acordo com o terminal em uso.
Para a maioria dos aplicativos usa-se o valor vt100 ou vt320, mas pode assumir outros valores
dependendo do fabricante do terminal, ou da necessidade de um aplicativo de um tipo de
terminal especfico. Exemplo:
export TERM=vt100
export TERM=ibm3151
export TERM=xterm
Korn Shell Script Treinamento bsico em programao
13


Exerccios
1 Crie um alias chamado limpatela que execute o comando clear.

2 Coloque o alias criado anteriormente no seu arquivo .kshrc. Faa com que seja carregado a cada
execuo de shell ou em cada login efetuado


3 Altere o comportamento dos seguintes comandos de acordo com as solicitaes abaixo:
rm - deve pedir confirmao sempre que um arquivo seja removido, independente do uso dos
caracteres geradores de nome de arquivo ( *, ?, {} e [])
ls - deve mostrar lista longa, diferenciando, no nome de arquivo, diretrios, arquivos comuns,
executveis, links, etc. Alm disso, deve mostrar o i-node do arquivo listado
clear - deve aguardar 5 segundos antes de limpar a tela
Korn Shell Script Treinamento bsico em programao
14


Mdulo 2 - Capacidades de substituio do Shell
Uma caracterstica interessante no Shell a capacidade de podermos manipular textos, nmeros e at sada
de comandos atravs de variveis.
Existem 3 tipos de substituio no Shell:
substituio de variveis;
substituio de comandos;
substituio do til.
Esses mtodos de substituio so utilizados para acelerar a execuo e a digitao da linha de comando, mas
sero bastante teis quando usados no desenvolvimento de aplicativos em Script-Shell.
Korn Shell Script Treinamento bsico em programao
15


Armazenamento das variveis do Shell
Variveis so reas de memria onde podem ser armazenados dados. Esses dados podem ser nmeros, textos,
listas de arquivos e at mesmo resultados da sada de comandos que podem ser utilizados posteriormente.
Existem duas categorias de variveis que podemos definir no Unix:
Variveis locais disponveis somente para o Shell corrente, no sendo acessadas
pelos sub-processos.
Variveis ambientais ou globais disponveis tanto para o Shell corrente como para os sub-
processos que venham a usar o contedo das variveis definidas.
Para tornar uma varivel com escopo global, ela deve ser exportada usando-se o comando export.
Para a visualizao das variveis locais usa-se o comando set. Para verificar quais variveis esto
exportadas, usa-se o comando env.
Inicializao e deleo de variveis do Shell
O armazenamento de variveis ocorre da seguinte maneira:
Variveis locais criadas atravs da sintaxe NOME=contedo. Possuem escopo local.
Variveis globais tornam-se globais atravs do comando export.
Se j existirem, o seus contedos sero atualizados.
Lembre-se: para tornar uma varivel global use o comando export, podendo-se com este comando criar a
varivel e, ao mesmo tempo, export-la:
export NOME=contedo
Para tornar uma varivel imune a alterao ou deleo deve-se usar o comando readonly:
readonly NOME
Para apagar uma varivel use o comando unset:
unset NOME
Umas das vantagens de manter-se uma varivel somente-leitura que, no Shell corrente, ela estar protegida
contra alterao ou excluso.
Variveis somente-leitura no podem ser apagadas. Elas somente deixaro de existir no momento em que for
efetuado o logout ou se o programa que criou a varivel for encerrado, exceto no caso de o script-shell estar
rodando na mesma instancia de interpretador que o iniciou (exec).
Substituio de variveis
Cada varivel ter um valor a ela associado. Quando o nome de uma varivel for precedido por um sinal de $
(dlar ou cifro), o Shell substituir o argumento passado pelo contedo da varivel. Este procedimento
Korn Shell Script Treinamento bsico em programao
16


conhecido como Substituio de Varivel. Uma das maneiras de exibirmos o contedo de uma varivel
usando o comando echo. Exemplos:
echo $PATH
/usr/bin:/usr/contrib/bin:/usr/local/bin

ARQUIVO=/home/morro.txt
more $ARQUIVO

PATH=$PATH:$HOME:.

TXT1=Casa
TXT2=Mae
TXT3=Joana
echo ${TXT1}_da_$TXT2_$TXT3
Observe que no ltimo exemplo foram usadas as chaves para circundar o nome da varivel, seno o Shell
poderia interpretar a varivel como TXT1_da caso as chaves no fossem usadas, o que seria um nome de
varivel diferente de TXT1, gerando mensagem de erro de parmetro no definido (dependendo da
configurao do ambiente do shell). Neste caso a varivel TXT1_da no existe. Qual seria o resultado da
sada do comando acima sem as chaves circundando a primeira varivel?
Substituio de comando
A substituio de comandos usada para substituir um comando por seu resultado dentro da mesma linha de
comando. Isto ser til quando for necessrio armazenar a sada de um comando em uma varivel ou passar
essa mesma sada para outro comando. A sintaxe utilizada :
$(comando) - o sinal $ faz parte da sintaxe na substituio de comandos.
A substituio de comandos permite que voc capture o resultado de um comando e utilize-o como um
argumento para outro comando, ou ento armazene sua sada em uma varivel. Veja os exemplos a seguir:
Armazenando o diretrio corrente em uma varivel
DIR_ATUAL=$(pwd)
Passando uma lista de arquivos do comando ls para o comando cp
cp $(cat list.file) /home/user1/backup
Passando a sada do comando date para os comandos banner e echo;
banner $(date)
echo Hoje $(date +"%d/%m/%Y") e so $(date +"%H:%M:%S")
Passando a sada do comando cat para o comando rm:
rm $(cat lista.de.arquivos)
Korn Shell Script Treinamento bsico em programao
17


Substituio do ~ (til)
A substituio do til executada de acordo com as seguintes regras:
Um til sozinho ou em frente a uma / substitudo pelo contedo da varivel HOME;
HOME=/home/user3
echo ~ - exibe o contedo de $HOME
ls lF ~/file1 - ser substitudo por /home/user3/file1
Um til seguido do sinal + substitudo pelo valor da varivel PWD;
PWD=/home/user3/tree
ls logt ~+/poodle - Ser substitudo por /home/user3/tree/poodle
Um til seguido de - ser substitudo pelo valor da varivel OLDPWD;
OLDPWD=/home/user3/mail
ls ~- - Ser substitudo por /home/user3/mail
Korn Shell Script Treinamento bsico em programao
18


Exerccios
1 Utilizando a substituio de comandos, atribua a data de hoje no formato dd/mm/yy varivel TODAY.
Consulte o manual on-line para verificar quais o formatos possveis para a exibio de datas e/ou
horas.




2 Liste o contedo do diretrio de outro usurio usando a substituio do til.




3 Crie uma varivel chamada MYNAME e armazene nela o seu primeiro nome. Como se mostra o
contedo da varivel?




4 Como fazer para que o Shell filho utilize o contedo da varivel MYNAME?




5 Torne a varivel TODAY somente-leitura. possvel excluir esta varivel?




6 Modifique seu prompt de comando, de modo que ele fique com a aparncia a seguir:
usurio@servidor:home_dir =>

Korn Shell Script Treinamento bsico em programao
19


Mdulo 3 - Introduo ao Quoting
Muitos caracteres no sistema Unix tem significado especial para o Shell. Por exemplo, o espao em branco
o delimitador entre comandos e argumentos. O carriage-return d o sinal para o Shell executar a linha
introduzida. O $ usado para mostrar o valor associado a uma varivel.
Ha situaes em que voc quer que o Shell no interprete o significado especial associado a esses caracteres.
Voc precisa apenas do caractere literal. Portanto, o sistema Unix deve oferecer um mecanismo que remova
ou omita o significado especial de um determinado caractere. Esse mecanismo conhecido como Quoting.
Korn Shell Script Treinamento bsico em programao
20


Caracteres usados no mecanismo de Quoting
Os caracteres usados no mecanismo de Quoting so os seguintes:
Barra invertida - \
Aspas simples - '
Aspas duplas - "
Quoting Barra Invertida - \
A barra invertida (\) remove o significado do caractere situado imediatamente aps a ela.
A barra invertida sempre remove o significado do prximo caractere. No h excees.
Exemplos:
echo a \\ omite o efeito do prximo caractere
echo a \ omite o efeito do prximo caractere

cor=vermelho\ branco\ e\ azul
echo o valor de \$cor e $cor
o valor de $cor e vermelho branco e azul

echo um dois \
> tres quatro
um dois tres quatro
Quoting Aspa Simples - '
As aspas simples (') tambm desativam a interpretao especial dos caracteres especiais. Todos os
significados dos caracteres especiais situados entre aspas simples so omitidos. As aspas simples no podem
ter seu significado omitido porque so necessrias para abrir e fechar a string assinalada.
No confunda as aspas simples (') com as crases (`).
Exemplos de uso de aspas simples:
COR='vermelho branco e azul'
echo 'o valor de $COR e $COR'
o valor de $COR e $COR

echo 'o valor de $COR e' $COR
o valor de $COR e vermelho branco e azul

echo 'this doesn' t work'
>

echo '*****************'
*****************
Korn Shell Script Treinamento bsico em programao
21


Quoting Aspa Dupla - "
Aspas duplas (") so menos abrangentes. A maior parte dos caracteres especiais situados entre aspas duplas
perdem o significado. As excees so o smbolo $ (quando usado para substituio de variveis e
comandos), {nome_de_varivel}, a crase (`) e as aspas duplas ("), que exigida para fechar a string
assinalada. Voc pode usar a barra invertida entre as aspas duplas para omitir o significado de $ ou ".
Exemplos:
COR="vermelho branco e azul"
echo "o valor de \$COR e $COR"
o valor de $COR e vermelho branco e azul

DIR_CORR="$LOGNAME - seu diretorio atual e $(pwd)"
echo $DIR_CORR
user3 - seu diretorio atual e /home/user3/tree

echo "todos estao aqui, \\, ', \" "
todos estao aqui, \, ', "
Korn Shell Script Treinamento bsico em programao
22


Exerccios
1 Utilizando o comando echo e o quoting \ que produza a seguinte sada:
$1 million dollars...and that's isn't a good business !




2 Atribua a string do exerccio anterior varivel LONG_STRING.




3 O que acontece quando digitado banner good day e banner "good day"?




4 O que acontece quando se digita echo '$ABC' e echo "$ABC"?




5 Armazene na varivel ASPA_DUPLA o caractere ". Verifique se ocorreu corretamente a atribuio.




6 Exiba as seguintes mensagens de maneira a obter-se a sada a seguir:
Este caractere anula o significado do caractere aps ele: \
Este par anula o significado de todos por ele envolvidos: ' '
E este aqui anula de todos, exceto \,$,{} e ": " "
Korn Shell Script Treinamento bsico em programao
23


Mdulo 4 - O que um script-Shell
O Shell um interpretador de comandos. Ele interpreta os comandos que voc digita no prompt do Shell.
Entretanto, voc pode ter um grupo de comandos do Shell para executar vrias vezes. O Shell disponibiliza a
capacidade de armazenar esses comandos em um arquivo e execut-lo como qualquer outro programa que
pertence ao sistema Unix. Este arquivo de comandos conhecido como Programa Shell ou Script-Shell.
Quando executado, o programa rodar como se os comandos fossem digitados interativamente no prompt do
Shell.
Para que o Shell acesse o programa Shell e execute-o, ele deve estar apto a ler o arquivo de programa e
executar cada linha. Portanto, as permisses do programa Shell devem ser de leitura e execuo. Para que o
Shell encontre seu programa, voc pode informar o caminho completo de sua localizao ou ele deve estar
localizado em um dos diretrios designados em sua varivel PATH. Os usurios podem criar um diretrio
bin abaixo do diretrio $HOME para armazenar os programas que eles desenvolveram e incluir $HOME/bin
na varivel PATH.
Programas Shell bem complexos podem ser desenvolvidos j que o Shell suporta variveis, argumentos de
linha de comando, entradas interativas, testes, desvios e loops.
Korn Shell Script Treinamento bsico em programao
24


Exemplo de programa Shell
Para criar um programa Shell, considere o seguinte:
Usando o editor de textos vi, crie um programa chamado, por exemplo, myprog.sh;
$ vi myprog.sh
# Este o programa myprog.sh
date
ls -F
Aps salvar o arquivo, adicione a permisso de execuo a ele;
$ chmod +x myprog.sh
Para executar o programa, digite o nome dele no prompt do Shell;
$ myprog.sh
Thu Jul 11 11:10 EDT 1994
f1 f2 memo/ myprog*
Comentrios em um programa Shell
recomendado a insero de comentrios no seu programa Shell para identificar e esclarecer o contedo do
programa. Os comentrios so precedidos pelo smbolo #. O Shell no tentar executar nada aps o #, que
pode aparecer em qualquer lugar da linha de comando.
Exemplo de documentao de Shell Script

# ===============================================================
# Nome do Script.: itcs104aix.sh
# Servidor ......: Qualquer servidor AIX (4.3.3, 5.1, 5.2)
# Sistema .......: Conformidade de Normas de Segurana
# Data da Criacao: 14/02/2004
# Criado por.....: Rodivaldo Marcelo Raimundo
# IT Management Certified Consultant
# IBM SDC Brasil - CIRATS Team
# ***************************************************************
# Descricao......: Checagem e apontamento dos desvios, nos servi-
# dores AIX, da norma ITCS104 v2.2
# ---------------------------------------------------------------
# Dependencias: userdefaultitcs.aix - parametros de usuarios
# users.id - usuarios de sistema
# groups.id - grupos de sistema
# itcs_chkuseraix.sh - checa parametros de usuarios
# itcs_osrperm.sh - checa os recursos do sistema
# diftempo.sh - calculo de tempo decorrido
# itcs_osrdir.dat - diretorios do sistema
#****************************************************************
# Alterado por.......: Rodivaldo Marcelo Raimundo
# Data da Alteracao..: 19/05/2005
# Motivo da alteracao: Atualizacao para a ITCS-104 v2.3
Korn Shell Script Treinamento bsico em programao
25


# ===============================================================
# Alterado por.......:
# Data da Alteracao..:
# Motivo da alteracao:
# ===============================================================
Korn Shell Script Treinamento bsico em programao
26


Passando dados para um programa Shell
Uma forma de passar dados para um programa Shell atravs do ambiente. Exemplo:
$ COLOR=magenta

# -------------------
# Programa color1.sh
# -------------------
echo Voce esta executando o programa: color1.sh
o valor da variavel COLOR e: $COLOR

$ color1.sh
Voce esta executando o programa: color1
o valor da variavel COLOR e:

$ export COLOR
$ color1.sh
Voce esta executando o programa: color1.sh
o valor da variavel COLOR e: magenta
importante lembrar que quando um programa Shell executado, todo o ambiente duplicado antes da
execuo (fork) e depois iniciada a execuo do script. Isto significa que o script estar rodando no Shell
filho, como um sub-processo do Shell onde ele foi iniciado com a digitao de seu nome. Se quiser que o
script execute na mesma sesso de Shell h duas maneiras. A primeira maneira faz com que o script rode e ao
terminar, automaticamente a sesso do Shell corrente ser encerrada, como se voc tivesse dado o comando
exit aps o trmino do Shell. Para isso use o comando exec antes do nome do script. Veja a sintaxe
usando como exemplo o shell script anterior:
exec color1.sh
Isso far com que o Shell color1.sh seja executado no Shell corrente, fazendo com que, ao seu trmino, a
sesso de terminal seja encerrada.
Se quiser que um script seja executado no Shell corrente sem o encerramento da sesso de terminal, preceda
o nome do script com um ponto (.) seguido de um espao (til para o carregamento de variveis e funes
na sesso corrente):
. color1.sh
Dessa maneira o script ser executado e no encerrar a sesso de terminal corrente, exceto se existir um
comando exit no script. Porm, se qualquer varivel existende tiver seu contedo alterado pelo script, essas
alteraes sero refletidas no ambiente aps o tmino da execuo do Shell Script.
Parmetros posicionais
A maioria dos comandos do sistema Unix aceita argumentos nas linhas de comando, que normalmente
informam ao comando corrente sobre arquivos ou diretrios nos quais o comando deve operar (cp f1 f2),
Korn Shell Script Treinamento bsico em programao
27


especificam opes que estendam as capacidades do comando (ls -l) ou simplesmente forneam string de
texto (banner tudo bem).
O suporte a argumentos na linha de comando tambm esto disponveis em programas Shell. Eles
representam um mecanismo conveniente para passar informaes ao seu utilitrio. Quando voc desenvolve
um programa que aceite argumentos de linha de comando, pode passar nomes de arquivos ou diretrios que
voc quer que seu utilitrio manipule, assim como voc faz nos comandos do sistema Unix. Voc tambm
pode definir opes de linha de comando que permitiro o acesso s capacidades extensivas de seu programa
Shell.
Os argumentos na linha de comando so referenciados no seu programa Shell atravs de variveis especiais
que so definidas em relao a uma posio do argumento na linha de comando. Esses argumentos so
chamados de parmetros posicionais porque o assinalamento de cada varivel especial depende da posio
do argumento na linha de comando. O nome dessas variveis corresponde sua posio numrica na linha de
comando, portando os nomes dessas variveis so os nmeros 0, 1, 2 e assim por diante at o ltimo
parmetro passado. Os valores dessas variveis so acessados da mesma forma que qualquer outro valor.
Portanto, para acessar os argumentos da linha de comando no seu programa Shell, voc deve referenci-los
como $0, $1, $2 e assim por diante. Aps $9 as chaves devem ser utilizadas: ${10}, ${24} e assim por
diante, caso contrrio, o Shell interpretar $10 como $1 e um 0 acrescentado a ele. $0 sempre ser o
programa ou o nome do comando.
A nica desvantagem no desenvolvimento de um programa que aceita argumentos de linha de comando que
os usurios devem conhecer sua sintaxe e o que os argumentos da linha de comando representam. Portanto,
se voc estiver desenvolvendo um Shell-script para ser usado por um usurio final sem conhecimento ou
noes de informtica e sistemas operacionais, procure sempre fazer os programas na forma de menu de
opes ou comandos que possam ser digitados diretamente na linha de comando, sem a necessidade de que
ele precise memorizar diversas opes, pois mesmo que voc desenvolva uma documentao, o usurio
nunca ter a pacincia necessria para l-lo. O que importa para ele a produtividade e no a complexidade
usada no desenvolvimento e para a operao do programa.
Variveis especiais do Shell - # e *
As variveis especiais do Shell # e * permitiro uma grande flexibilidade no tratamento de listas de
argumentos variveis. Atravs de $# voc sempre saber quantos elementos foram entrados e poder acessar
a lista inteira atravs da varivel $*, no importando o nmero de argumentos existentes. Observe que o
comando ($0) no includo na lista varivel de argumentos.
Cada argumento da linha de comando ainda mantm sua identidade individual, por isso voc poder
referenci-los coletivamente atravs de $* ou individualmente atravs de $1, $2, $3, e assim por diante.
Exemplos:
# -----------------------
# Programa argumentos.sh
# -----------------------
echo "Quantidade de argumentos da linha de comando: $#"
echo "Lista de argumentos da linha de comando: $*"
echo "O primeiro argumento da linha de comando e: $1"
echo "O ultimo argumento da linha de comando e:" $(echo $*|\
cut -d" " -f$#)

Korn Shell Script Treinamento bsico em programao
28


$ argumentos.sh AA bb cc dd 11 33
Quantidade de argumentos da linha de comando: 6
Lista de argumentos da linha de comando: AA bb cc dd 11 33
O primeiro argumento da linha de comando e: AA
O ultimo argumento da linha de comando e: 33
O comando shift
O comando shift reassinalar os argumentos de linha de comando para os parmetros posicionais,
permitindo que voc incremente atravs dos argumentos da linha de comando. Aps um comando shift n,
todos parmetros em * so movidos para a esquerda n posies e # decrementado em n. O default para n
1. O comando shift no afeta o parmetro posicional 0.
Uma vez concludo o comando shift, os argumentos que foram excludos da linha de comando so
perdidos. Caso voc necessite referenci-los posteriormente no seu programa, ser necessrio grav-los antes
de executar o comando shift. Exemplos:
# ------------------
# Programa color5.sh
# ------------------
ARGS_ORIG=$*
echo "Existem $# argumentos na linha de comando"
echo "Eles sao $*"
shift 2
echo " Existem $# argumentos na linha de comando"
echo "Eles sao $*"
echo "Os argumentos originais sao: $ARGS_ORIG"

$ color5.sh vermelho verde amarelo azul laranja preto
Existem 6 argumentos na linha de comando
Eles sao vermelho verde amarelo azul laranja preto
Existem 4 argumentos na linha de comando
Eles sao amarelo azul laranja preto
Os argumentos originais sao: vermelho verde amarelo azul laranja preto
O comando read
O comando read usado para absorver informaes digitadas no terminal durante a execuo do programa.
Normalmente voc pode direcionar o usurio, atravs do comando echo, informando-o a respeito da entrada
desejada. Portanto, cada comando read deve ser precedido por um comando echo e uma mensagem ao
usurio. O comando read far uma pausa no script, aguardando a digitao do dado a ser entrado na
varivel e ser pressionada a tecla ENTER em seguida, como o prompt do Shell, que aguardo a digitao de
um comando e o pressionamento de ENTER para execut-lo.
O comando read especificar uma lista de nome de variveis em que os valores sero assinalados com os
contedos que o usurio informar no prompt, sendo que esses contedos devem ser delimitados por espaos
em branco.
Korn Shell Script Treinamento bsico em programao
29


Exemplo:
# --------------------
# Programa pedenome.sh
# --------------------
clear
echo Entre com o codigo desejado
read CODIGO
grep $CODIGO /home/user1/dados/arquivo.dat
Caso existam mais variveis especificadas pelo comando read do que palavras digitadas pelo usurio, as
variveis que sobrarem sero assinaladas com o valor NULL.
Se o usurio digitar mais palavras do que a quantidade de variveis existentes, todos os dados restantes sero
assinalados para a ltima varivel da lista.
Depois de assinaladas, voc pode acessar as variveis da mesma forma que qualquer outra varivel do Shell,
isto , usando o processo de substituio de variveis.
O comando echo e os caracteres de sada
Cada caractere de sada deve ser precedido por uma barra invertida (\) e estar entre aspas duplas ("). Esses
caracteres de sada so interpretados pelo comando echo e no pelo Shell.
Caractere Ao
\b Backspace
\c Suprime a terminao newline
\f Alimentao de formulrio
\n Newline
\r Carriage return
\t Tabulao
\a Caractere de alerta (^G ou beep)
\\ Barra invertida
\0nnn Caractere de cdigo ASCII nnn em octal
Em implementaes do Unix que usam o interpretador BASH, estes caracteres de controle s funcionaro se
o comando echo for seguido pela opo -e aps o comando. Exemplos:
# -----------------
# Programa nomes.sh
# -----------------
echo "Entre com os nomes: \c"
read NOME1 NOME2 NOME3
echo "Os nomes digitados foram $NOME1, $NOME2, $NOME3"


$ nomes.sh

Korn Shell Script Treinamento bsico em programao
30


Entre com os nomes: joao maria antonio joaquim marcelo
echo os nomes digitados foram joao, maria, antonio joaquim marcelo
Escrevendo funes no Shell
O comando function usado para escrever programas Shell modulares. Programao modular o
conceito de se alocar os cdigos utilizados freqentemente em uma certa rea (mdulo) do script-Shell para
que o mdulo, ou funo, seja chamado quando necessrio, ao invs de repetir o mesmo cdigo.
Todas as funes a serem definidas devem ser colocadas no incio do script-Shell, pois assim elas estaro
prontas para serem invocadas pelo mdulo principal colocado ao final do script e que no faz parte das
funes. O mdulo principal no o comando function para ser definido.
As sintaxes possveis para a criao de uma funo so as seguintes:
Sintaxe 1
function nome_da_funo
{
instruo 1
instruo 2
instruo 3
....
instruo n
}
Sintaxe 2
nome_da_funo ()
{
instruo 1
instruo 2
instruo 3
....
instruo n
}
Exemplo de criao de uma funo e sua chamada no programa Shell:
install ()
{
echo "Arquivo de instalao: $1"
chmod +x $1
mv $1 $HOME/bin
echo "Instalao completada"
}
echo "Digite o nome do arquivo: \c"
read ARQUIVO
install ARQUIVO
Korn Shell Script Treinamento bsico em programao
31


Tcnicas adicionais de programao
Documente os programas Shell precedendo um comentrio com um sinal de numeral (#).
O caractere # utilizado para definir comentrios no programa Shell. O Shell ignorar qualquer coisa que
venha aps o # at o final da linha. Os comentrios informam aos outros (inclusive a voc) que esto lendo o
programa do propsito dos comandos que esto nele contidos.
Uma forma alternativa apara a execuo de um programa Shell :
ksh programa_Shell
Neste caso, o programa Shell no precisa ter a permisso de execuo, tendo que obrigatoriamente possuir
permisso para leitura.
Este comando chama um sub-Shell e o designa como interpretador de comandos para ser utilizado durante a
execuo do programa. Isto tambm til quando voc est rodando sob um Shell e deseja executar um
programa Shell escrito em outra linguagem de comando Shell.
Voc tambm pode especificar o interpretador de comandos que ser utilizado durante a execuo de um
programa Shell atravs do comando #!/usr/bin/Shell_name como a primeira linha do programa
Shell. Portanto, se voc est atualmente rodando sob um Korn Shell interativamente, mas possui um script do
C-Shell que gostaria de executar, a primeira linha do programa C-Shell deveria ser:
#!/usr/bin/csh
Apesar de no existir um depurador para o programa Shell, cada linha do Shell pode ser vista com o seguinte
comando:
ksh -x programa_Shell argumentos
Isto exibir cada linha do programa Shell antes de execut-lo, permitindo que voc veja como o Shell est
executando a gerao de nome do arquivo, a substituio de variveis e substituio de comandos. Esta
opo especialmente til para descobrir erros de digitao.
Caso voc esteja editando um programa e queira quebrar uma linha em vrias linhas, use a barra invertida no
final da linha. Isso diz ao Shell que a linha seguinte deve ser interpretada como uma mesma linha, apesar de
elas estarem separadas. Veja o exemplo:
# ------------------
# Programa linhas.sh
# ------------------
echo "Embora este programa esteja mostrando varias \
linhas, na verdade esta mensagem e mostrada na \
tela como se fosse uma unica linha, porque o Shell \
interpreta como se fosse somente uma linha."
echo "Basta executa-lo para ver o resultado..."
Isto ser til no momento em que, na edio de um script, a sua digitao comear a sair da rea visvel da
tela.
Korn Shell Script Treinamento bsico em programao
32


Exerccios
1 Crie um script-Shell chamado prog01.sh que faa os seguintes passos:
exiba uma mensagem de boa vindas como comando banner
defina uma varivel chamada MYNAME contendo seu primeiro nome
mostre o contedo da varivel criada com uma mensagem ao usurio
mostre a data e hora no formato dd-Nome_do_Mes-YYYY
mostre todos os usurios logados no momento


2 Interativamente, direcione a sada do comando date para a varivel DATE_VAR. Em seguida crie
um Shell-script chamado exibedata.sh que mostrar o contedo da varivel criada
anteriormente.


3 Se a linha de comando de um script-Shell
myshellprog.sh abc def -d -4 +900 xyz

O que ser est armazenado nas seguintes variveis?

$# _____________________________________

$3 _____________________________________

$7 _____________________________________

$* _____________________________________

$0 _____________________________________



4 - Crie um script-Shell que pea seu nome completo e o exiba em ordem inversa.


Korn Shell Script Treinamento bsico em programao
33


Mdulo 5 - Cdigos de retorno e a varivel ?
Todos os comandos do Unix geraro um cdigo de retorno aps a execuo do comando. Este cdigo de
retorno comumente usado para determinar se o comando foi executado normalmente (retorno 0) ou
encontrou algum erro (retorno diferente de 0). O cdigo de retorno diferente de 0 reflete o erro que foi
gerado. Por exemplo, erros de sintaxe geralmente ajustam o cdigo de retorno para 1. O comando true
sempre retornar 0 e o comando false sempre retornar 1.
A maioria das decises de programao sero controladas pela anlise dos cdigos de retorno. O Shell define
uma varivel especial (?) que manter o valor do cdigo de retorno anterior. Sempre ser possvel mostrar o
cdigo de retorno anterior com o comando:
echo $?
Quando da execuo de testes condicionais, o cdigo de retorno indicar se a condio era verdadeira
(retorno 0) ou falsa (retorno diferente de 0).
Exemplos:
$ true
$ echo $?
0
$ ls
$ echo $?
0
$ echo $?
0
$ false
$ echo $?
1
$ cp
$ echo $?
1
$ echo $?
0
importante o entendimento da utilidade dos cdigos de retorno, pois sero muito usados daqui em diante no
que tange a tomadas de decises em programas Shell.


Korn Shell Script Treinamento bsico em programao
34


Avaliando expresses - test ou [ ]
O comando test avalia a expresso e ajusta o cdigo de retorno. A sintaxe do comando test :
test expresso ou [ expresso ]
Para verdadeiro ser retornado valor 0. Para falso o valor ser diferente de 0
O comando test pode avaliar a condio de Nmeros Inteiros, Strings (cadeias de caracteres) e
Arquivos (incluindo diretrios).
Quando usados os colchetes, estes devem possuir espaos em branco aps o [ e antes do ].
Testes numricos

[ nmero relao nmero ]

Relaes:
-lt menor que
-le menor que ou igual a
-gt maior que
-ge maior que ou igual a
-eq igual a
-ne no-igual a
Exemplo: (assumindo NUMERO=3)
$ [ $NUMERO -lt 7 ]
$ echo $?
0
$ [ $NUMERO -gt 7 ]
$ echo $?
1
Quando testar o valor de uma varivel Shell, voc deve se precaver da possibilidade de que a varivel pode
conter NULL (nada). Veja a seguinte situao em que a varivel NUMERO no foi criada, anteriormente foi
digitado o comando set u (ativa erro em caso de no existir a varivel informada):
$ [ $NUMERO = 3 ]
ksh: test: argument expected
Se NUMERO no recebeu um valor prvio, $NUMERO ser NULL. Quando o Shell executar a substituio de
varivel, o comando que tentar executar ser:
[ = 3 ]
Korn Shell Script Treinamento bsico em programao
35


O caso acima no uma situao completa de teste e est garantida a causa de um erro de sintaxe. Um modo
simples de contornar isto colocar a varivel que est sendo testada entre aspas duplas:
$ [ "$NUMERO" = 3 ]
Quando o Shell executar a substituio de varivel, o comando que o KSH tentar executar ser:
[ "" = 3 ]
Como regra geral, voc deve envolver todas as expresses $VARIAVEL com aspas duplas para evitar
substituies indevidas de variveis pelo Shell.
Testes de string
O comando test pode ser usado para comparar strings.
Os operadores de string so:
string1 = string2 - verdadeiro se as duas strings so idnticas
string1 != string2 - verdadeiro se as duas string so diferentes
-z string - verdadeiro se o comprimento da string 0
-n string - verdadeiro se o comprimento diferente de 0
string - verdadeiro se o comprimento diferente de 0
A aspas duplas tambm protegero a avaliao da string se a varivel possuir brancos. Por exemplo:
$ X="Sim nos iremos"
$ [ $X = sim ]
causa erro de sintaxe, sendo interpretado pelo Shell como:
[ Sim nos iremos = sim ]
Quando a substituio de variveis envolvida por aspas duplas
[ "$X" = sim ]
O teste passa a ser interpretado como
[ "Sim nos iremos" = sim ]
Comparao numrica x comparao de strings
O Shell tratar todos os argumentos como nmeros quando executar testes numricos, e todos os argumentos
como string quando executar testes com strings. Isto melhor ilustrado pelo exemplo a seguir:
$ X=03
$ Y=3
Korn Shell Script Treinamento bsico em programao
36


$ [ "$X" -eq "$Y" ] - compara numeral 03 com o numeral 3
$ echo $?
0 - verdadeiro pois eles so numericamente equivalentes

$ [ "$X" = "$Y" ] - compara a string "03" com a string "3"
$ echo $?
1 - falso pois elas no so strings idnticas
Teste de arquivos
Sintaxe para testes relativos a arquivos e diretrios:
[ -opo nome_do_arquivo ]
H vrias opes para a validao de arquivos. A relao parcial abaixo inclui:
-f - Verdadeiro se o arquivo existe e pode ser lido
-s - Verdadeiro se o arquivo existe e o tamanho diferente de 0 (zero)
-w - Verdadeiro se o arquivo existe e pode ser gravado
-x - Verdadeiro se o arquivo existe pode ser executado
-d - Verdadeiro se o arquivo existe um diretrio
Operadores booleanos para o comando test
-o - or (ou)
-a - and (e)
! - not (negao)
\( ...\) - agrupamento de condies (as barras invertidas fazem parte da sintaxe)
Exemplos:
[ "$ANS" = y -o "$ANS" = Y ]
[ "$NUM" -gt 10 -a "$NUM" -lt 20 ]
test -s /home/root/arquivo.dat -a -r /home/root/arquivo.dat
O operador ! usado em conjunto com os outros operadores:
test ! -d /home/root/arquivo.dat
O exemplo seguinte serve para identificar se h duas linhas de argumentos de comandos, e que o primeiro
argumento um -m, e que o ltimo argumento da linha de comando um diretrio ou um arquivo cujo
tamanho maior do que zero:
[ \( $# -eq 2 \) -a \( "$1" = "-m" \) -a \( -d "$2" -o -s "$2" \) ]
Korn Shell Script Treinamento bsico em programao
37


Comandos exit e return
O comando exit terminar a execuo de um programa Shell e ajustar o cdigo de retorno (se informado).
Ele normalmente ajustado para 0 para indicar a terminao normal e para no-zero para indicar uma
condio de erro. Se nenhum argumento utilizado, o cdigo de retorno ajustado para o do ltimo
comando executado antes do comando exit.
Ocasionalmente voc precisa retornar e uma funo com um status de sada. O comando return pra a
execuo da funo e retorna para o procedimento chamado com um cdigo de retorno. Se o cdigo de
retorno no especificado, o cdigo de retorno aquele do ltimo comando dentro da funo. Quando o
return chamado fora de uma funo, ele age exatamente como o comando exit.
Exemplo do uso do comando exit:
# ------------------
# Programa exit.prog
# ------------------
echo "saindo do programa agora..."
exit 99


$ exit.prog
saindo do programa agora...
$ echo $?
99
Exemplo do uso do comando return:
# -----------------
# Programa ret.test
# -----------------
rtn ()
{
echo "Retorno da funcao ..."
return 99
}
echo "Chamando funcao rtn"
rtn
echo $?


$ ret.test
Chamando funcao rtn
Retorno da funcao...
99
Korn Shell Script Treinamento bsico em programao
38


Desvio condicional - a construo if/else
Usada para desvios de deciso simples.
Sintaxe:
if [ condio ];then
comandos...
comandos...
comandos...
fi
Exemplo:
if [ -s /home/root/.profile ];then
echo "Arquivo existe...\a"
fi
O comado test normalmente usado em uma construo if para controlar o fluxo de execuo, mas
qualquer comando pode ser usado, uma vez que todos os comandos do Unix geram um cdigo de retorno,
como mostrado no exemplo:
if grep kingkong /etc/passwd;then
echo "King Kong encontrado..."
fi
A construo if tambm executa controle de programas quando erros so encontrados, como abaixo:
if [ $# -ne 3 ];then
echo "Sintaxe incorreta..."
echo "Uso: cmd arg1 arg2 arg3"
exit 99
fi
Desvio condicional - a construo if/elif/else
Usada para desvios de mltipla deciso.
Sintaxe:
if [ condio ];then
comandos...
elif [ condio ];then
comandos...
elif [ condio ];then
comandos...
else
comandos...
fi

Korn Shell Script Treinamento bsico em programao
39


Exemplos:
if [ $X -lt 10 ];then
echo "$X e menor que 10..."
elif [ $X -gt 10 ];then
echo "$X e maior que 10"
else
echo "$X e igual a 0..."
fi
Desvio condicional - a construo case
A construo case normalmente usada para suportar interfaces de menu ou interfaces que tomaro alguma
deciso baseada em vrias opes de entrada do usurio. Sintaxe:
case $VARIVEL in
caso1) comandos
;;
caso2) comandos
;;
caso3) comandos
;;
*) comandos
;;
esac
comum encerrar todos os padres case com um *) para gerar uma mensagem ao usurio e inform-lo que
ele no deu uma resposta aceitvel. Exemplo:
echo " MENU DE OPCOES\n"
echo "d - mostra data e hora"
echo "w - para mostrar usurios logados"
echo "l - para listar o contedo do diretorio corrente"
echo "Por favor entre com sua opcao: \c"
read OPCAO

case $OPCAO in
[dD]) date
;;
[wW]) who
;;
[lL]) ls
;;
*) echo "Opcao invalida\a"
;;
esac
Korn Shell Script Treinamento bsico em programao
40


Embora no seja obrigatrio bom que, quando estiver usando estruturas de desvio (assim como as de loop
que veremos adiante), voc procure efetuar a indentao das estruturas, ou seja, deslocar 3 ou 4 espaos para
dentro dos comandos que iniciam e terminam as estruturas.
Note que em todos os exemplos foi usada a tcnica de indentao, facilitando bastante a leitura de um
programa, afinal, se todas as estruturas fossem alinhadas esquerda, voc poderia ter problemas com a
manuteno de seus scripts, principalmente quando voc tiver vrias estruturas if e case encadeadas (umas
dentro das outras), o que muito comum no desenvolvimento de scripts complexos medida que se domina
o uso da linguagem.
Korn Shell Script Treinamento bsico em programao
41


Exerccios
1 Crie uma varivel chamada X e teste se o valor dela a string xyz.




2 Crie uma varivel chamada Y e atribua um nmero a ela. Teste se o seu contedo menor ou igual a
0.




3 Crie um programa que pea a entrada de um valor e o armazene na varivel Y. Exiba sim-
positivo se o nmero entrado for positivo e no-falso se ele for negativo. A no ser que queira
colocar mais uma exceo em seu programa, matematicamente o numeral zero considerado positivo.




4 Escreva um programa que verifique se a quantidade de argumentos passados na linha de comando
igual e 3. Se no for, deve ser mostrada uma mensagem de erro de maneira clara ao usurio sobre a
falta de argumentos.




Korn Shell Script Treinamento bsico em programao
42


Mdulo 6 - Repetindo a execuo de um grupo de comandos
(looping)
As construes de loopings permitem que voc repita uma lista de comandos, e tal como nas construes de
desvios, a deciso de continuar ou encerrar um looping estar baseada no cdigo de retorno de um comando
chave. O comando test freqentemente usado para controlar a continuidade de um loop.
Lembre-se de sempre usar a tcnica de indentao para que facilite a leitura de seus scripts, tanto para voc
quanto para outra pessoa que possa ser incumbida de dar manuteno em seus programas, se for o caso.
Korn Shell Script Treinamento bsico em programao
43


Avaliao aritmtica - comando let ou (( )).
Os loops so normalmente controlados pelo incremento de uma varivel numrica. O comando let habilita
o shell script para usar expresses aritmticas. Esse comando permite inteiros extensos (long integer).
O uso de (( )) em volta da expresso substitui o uso de let. Os operadores reconhecidos pelo Shell so
listados abaixo, em ordem decrescente de precedncia.
Operador Descrio
============= =====================
! Negao lgica (not)
* / % Multiplicao, diviso e resto
+ - Adio e subtrao
< > <= >= Comparao relacional
== != Igual e diferente
Os parnteses podem ser usados para mudar a ordem de avaliao de uma expresso, como em:
let "x = x / ( y + 1 )"
Note que, no comando let, as aspas duplas so necessrias para omitir o significado principal dos
parnteses e dos espaos em branco.
Se preferir sempre colocar espaos para separar operandos e operadores dentro da expresso, as aspas duplas
devem ser usadas com o comando let ou deve ser usada a sintaxe (( )):
let "x = x + ( y / 2 )" ou (( x = x + ( y / 2 ) ))
Ao usar os operadores lgicos e relacionais, a varivel de cdigo de retorno do Shell ( ? ) refletir o valor de
verdadeiro (0) ou falso (1) do resultado.
As aspas duplas devem ser usadas para evitar a interpretao dos sinais de maior que e menor que como
redirecionamento de E/S.
Korn Shell Script Treinamento bsico em programao
44


Executando enquanto a condio verdadeira - while
A estrutura de looping while repete o loop enquanto a condio verdadeira.
Sintaxe:
while condio;do
comandos...
comandos...
comandos...
done
Exemplo:
$ vi test_while
X=1
while (( X <= 10 ));do
echo "Ola....o valor de X e $X"
let "X = X + 1"
done


$ vi test_while
X=1
while [ $X -le 10 ];do
echo "Ola....o valor de X e $X"
(( X = X + 1 ))
done
Obs: cuidado com os loops infinitos dentro de while. So aqueles em que o comando de controle sempre
retorna verdadeiro. Exemplo:
while true;do
echo "Ol...estou executando sem parar"
done
A nica maneira de interromper o programa pressionando b bb bC CC C.
Mais exemplos de uso da construo while
Exemplo 1:
# Repete enquanto ANS sim
ANS=sim
while [ "$ANS" = "sim" ];do
echo "Digite um nome: \c"
read NOME

echo $NOME >>file.nomes
echo "Continua? "
Korn Shell Script Treinamento bsico em programao
45


echo "Digite sim ou nao"
read ANS
done


Exemplo 2:
# Repete enquanto h argumentos na linha de comando
while (( $# != 0 ));do
if [ -d $1 ];then
echo "Contedo de $1:"
ls -F $1
fi
shift
echo "H $# itens na linha de comando..."
done
Executando at que a construo seja verdadeira - until
A estrutura de looping until repete o loop at que a condio seja verdadeira, ou seja, executa enquanto a
condio falsa.
Sintaxe:
until condio;do
comandos...
comandos...
comandos...
done
Programa test_until verso 1:
X=1
until (( X > 10 ));do
echo "Ola....o valor de X e $X"
let "X = X + 1"
done
Programa test_until verso 2:
X=1
until [ $X -gt 10 ];do
echo "Ola....o valor de X e $X"
(( X = X + 1 ))
done
Obs: cuidado com os loops infinitos dentro de until. So aqueles em que o comando de controle sempre
retorna verdadeiro. Exemplo:
Korn Shell Script Treinamento bsico em programao
46


X=1
until [ $X -eq 0 ];do
echo "Ol...estou executando sem parar"
done
A nica maneira de interromper o programa acima atravs de bC bC bC bC.
Mais exemplos de uso da construo until
Exemplo 1 Usando test:
# Repete at ANS ser no
ANS=sim
until [ "$ANS" = "nao" ];do
echo "Digite um nome: \c"
read NOME
echo $NOME >>file.nomes

echo "Continua? "
echo "Digite sim ou nao"
read ANS
done
Exemplo 2 usando let:
# Repete at que no haja argumentos na linha de comando
until (( $# == 0 ));do
if [ -d $1 ];then
echo "Contedo de $1:"
ls -F $1
fi
shift
echo "H $# itens na linha de comando..."
done
Executando grupos de comandos atravs de uma lista - for
O loop for uma construo muito flexvel. Ela capaz de circular qualquer lista que possa ser gerada. As
listas podem ser facilmente criadas por substituio de comandos. Com pipes e filtros, uma lista pode ser
gerada a partir de qualquer comando ou arquivo. Diferente de outras linguagens de programao, o loop for
no foi feito para execuo de lista de comandos atravs de valores fixos de contadores, mas pode ser
adaptado facilmente para isso apesar das limitaes da linha de comando do Unix.

for VARIAVEL in Lista_a_Processar;do
comandos...
comandos...
comandos...
done

Korn Shell Script Treinamento bsico em programao
47


A construo for funciona assim:
a) a VARIAVEL assinalada com a string do primeiro item de Lista_a_Processar;
b) os comandos entre for e done so executados;
c) a VARIAVEL assinalada com o prximo item de Lista_a_Processar;
d) os comandos entre for e done so executados;
Os passos acima continuaro at que o ltimo item da lista tenha sido processado pelo loop for.
Exemplos:
# Tabuada do 2 com 5 itens
for X in 1 2 3 4 5;do
echo "2 x $X = \c"
(( X = X * 2 ))
echo $X
done
$ test_for
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10


# Envia e-mail para todos os usurios do arquivo /etc/passwd
for NAME in $(grep home /etc/passwd | cut -d: -f1);do
mail $NAME < aviso.reuniao
echo "Enviado arquivo aviso.reuniao para $NAME
done


# Lista o contedo de um diretrio
for FILE in *;do
if [ -d $FILE ];then
ls -F $FILE
fi
done
Montando um menu com opes autonumeradas - select
O loop select usado para a criao de menus numerados gerados a partir de uma lista passada,
semelhante ao comando for.
Cada opo possui um nmero que atribudo automaticamente a cada opo da lista. O usurio deve digitar
o nmero da opo desejada e pressionar a tecla e ee e.
Korn Shell Script Treinamento bsico em programao
48



select VARIVEL in Lista_de_Opes;do
comandos...
comandos...
...
done
A opo escolhida fica armazenada na varivel ambiental REPLY. Esta pode, atravs das estruturas de
tomada de deciso (if e case), ser usada para executar uma determinada atividade exigida pelo programa
Shell desenvolvido.
O menu pode ser encerrado pelo pressionamento da combinao das teclas bD bD bD bD, mas aconselha-se que
seja programada uma sada mais elegante atravs do comando break, o mesmo usado para sair
incondicionalmente dos loops while, until e for.
O prompt do menu, que usa a varivel PS3 e lhe atribudo o contedo #?, pode ser personalizado para
mostrar a mensagem desejada de acordo com o contexto do menu apresentado. A lista de opes que far
parte do menu pode ser gerada atravs de substituio de variveis, substituio de comandos ou mesmo
listas estticas como.
Quando executada uma opo do menu, este no volta a ser automaticamente mostrado quando retorna da
execuo, mostrando apenas o prompt do menu. Basta pressionar e novamente que o menu ser
reapresentado.
Veja o exemplo do menu, exemplificado anteriormente para a instruo de desvio case, agora modificado
para funcionar dentro de um loop select:
#!/usr/bin/ksh
# Definicao do prompt a ser mostrado pelo menu
# --------------------------------------------
PS3='Digite a opcao desejada => '

# Lista de opcoes do menu passados para
# o comando select
#--------------------------------------
select OPCAO in "Data e hora" \
"Usurios logados" \
"Lista diretorio corrente" \
"Sair" ; do

case $REPLY in
1) date +"Hoje e %d/%m/%y e sao %T"
;;
2) who -u
;;
3) ls -ltr
;;
4) echo "Encerrando o script em 5 segundos..."
sleep 5
Korn Shell Script Treinamento bsico em programao
49


break
;;
*) echo "Opcao $REPLY invalida... Redigite\a"
;;
esac
done

echo "Programa encerrado. Obrigado"
echo ""
Note, no exemplo acima, que para uma sada mais elegante da estrutura, dispensando o uso do b bb bC CC C ou
b bb bD DD D, foi usado o comando break para finalizar o loop select e mostrar uma mensagem de
encerramento do programa. Os comandos break and continue so mostrados a seguir.
Alterando a seqncia de execuo de um loop - break e continue
break [n] - termina a interao do loop e salta para o prximo comando aps o n-simo done.
continue [n] - cessa a interao atual do loop e salta para o incio da prxima interao n-sima
incluindo o loop.
Exemplo do uso de break e continue
while (( 1 == 1 ));do
echo "Digite o nome do arquivo a remover: \c"
read FILE

if [ ! -f $FILE ];then
echo "$FILE no um arquivo comum...\a"
continue
fi
echo "Removendo $FILE..."
rm $FILE
break
done
Os comandos break e continue so usados nas estruturas while, until, for e select.
Korn Shell Script Treinamento bsico em programao
50


Exerccios
1 Criar um programa que pea para o usurio digitar um nome qualquer na varivel NOME. Ele s
encerrar o programa quando for digitada a string sair (no importa se maisculas ou minsculas).





2 Crie um programa que pea uma determinada quantidade nmeros e exiba a soma dos nmeros
informados.





3 Crie um menu que possua 3 opes:
d - mostrar a data no formato dd/mm/yy
h - mostrar a hora no formato hh:mm:ss
l - usurios logados (se estourar a tela, deve paginar)

Se for pressionada a tecla e ee e, deve-se sair do programa





4 Criar um programa que rode em retaguarda. Ele dever checar se o usurio root est logado.
Se estiver, dever mostrar uma mensagem no terminal a cada 2 segundos com um bip.
Korn Shell Script Treinamento bsico em programao
51


Mdulo 7 - Conceito de sinais
Um sinal um flag transmitido para um processo quando certos eventos ocorrem. Alguns dos sinais mais
conhecidos do Unix so:
NULL Sada do Shell (^D ou exit)
HUP Hung-up - enviado para processos em retaguarda no logout
INT Interrupo (^C)
QUIT Quit (^\) - gera arquivo chamado core
KILL Morte certa (no pode ser capturado ou ignorado)
TERM Terminao por software
O comando kill transmite um sinal explcito para um ou mais processos.
Digite kill -l ou trap l para obter uma lista dos sinais disponveis no sistema operacional.
Korn Shell Script Treinamento bsico em programao
52


O que uma TRAP?
Uma trap uma maneira de capturar sinais transmitidos a um processo e executar alguma ao baseada no
tipo de sinal que foi recebido.
A trap simplesmente espera por sinais enviados ao Shell, identifica-o, e ento executa a ao associada. Uma
trap pode ser definida para remoo de arquivos temporrios no trmino de um programa ou pode definir
sinais que devem ser ignorados durante um segmento sensvel na execuo do programa.
O comando trap
O comando trap pode ser usado em programas Shell para capturar um sinal antes que ele possa abortar um
processo e executar alguma ao adicional ou alternativa.
Os comandos trap so normalmente colocados no incio de um programa Shell, mas eles podem estar em
qualquer parte do script. As traps so assinaladas pelo Shell quando este l o comando trap. As traps so
acionadas quando um sinal relacionado recebido.
Sintaxe:
trap 'comandos' sinal1 sinal2 ... sinalN
Exemplo:
trap 'echo bye ; exit' 2 3 15
while (( 1 == 1 ));do
echo "Hello..."
done
Korn Shell Script Treinamento bsico em programao
53


Ignorando sinais
O comando trap pode ser usado para ignorar determinados sinais quando este for recebido pelo processo.
Sintaxe:
trap '' sinal1 sinal2 ... sinalN
Veja este exemplo de script ignorando o sinal INT (equivalente ao pressionamento da tecla b bb bC CC C):
trap '' 2
while (( 1 == 1 ));do
echo "Hello..."
sleep 2
done
Localizao do comando trap
Coloque o comando trap no incio do programa para gerenciar a remoo de arquivos temporrios se o
programa for abortado:
trap 'rm /tmp/tempfile;exit' 2 3 15
Coloque o comando trap antes de sesses crticas de cdigo para ignorar sinais:
trap '' 2 3 15
Restaure o comando trap para ao padro quando uma seo de cdigo sensvel completada:
trap 2 3 15
Korn Shell Script Treinamento bsico em programao
54


Exerccio
1 Escreva um programa Shell que emita uma mensagem na sua tela a casa 3 segundos com um bip. Torne
este programa imune aos sinais INT, HUP e TERM.
Como voc pode parar este programa se:
- Estiver rodando em primeiro plano: _________________________________________
- Estiver rodando em segundo plano: _________________________________________



2 Faa com que as linha de comando abaixo fique imune aos mesmos sinais do exerccio anterior:
a) nohup find ./|cpio -ocvdum >/dev/rmt0 &
b) nohup gunzip -dv backup_banco.tar.gz|tar -xvf - &
Consulte a pgina de ajuda do comando nohup para ajud-lo a solucionar qualquer problema na
execuo das linhas de comando acima.
Korn Shell Script Treinamento bsico em programao
55


Mdulo 8 - Uma pequena introduo linguagem AWK
A linguagem AWK uma linguagem que foi inventada em 1977. um utilitrio bastante til para a
manipulao e formatao de sada de strings, pois permite que dados sejam mostrados em um formato
melhor para visualizao. O nome (bastante estranho por sinal) derivado das iniciais de seus trs criadores,
Aho, Kernighan, e Weinberger. Ele um stream editor (editor de fluxo). Pode-se passar dados para ele via
pipeline, mas tambm ele pode manipular dados de um arquivo. Possui a capacidade de guardar contextos,
efetuar comparaes em muitas outras coisas que qualquer linguagem de programao faz. Por exemplo, ele
no limitado somente a trabalhar com linhas simples. Ele pode unir mltiplas linhas, isso se voc fizer as
coisas certas.
A forma mais simples de um programa AWK um programa de uma linha somente como neste exemplo
genrico:
awk '{faa alguma coisa}' arquivo
Este "faa alguma coisa" pode ser uma simples declarao print ou algo muito mais complicado, atuando
em cada linha recebida do arquivo texto passado como parmetro. Programas feitos com o AWK tem uma
semelhana com a sintaxe da linguagem C. Um exemplo simples:
ls l /home/user1 | awk '{print $3,$4,$9}'
O exemplo acima ir exibira a terceira, quarta e nona colunas do comando ls -l, onde as colunas so
definidas como "coisas delimitadas por espao". Esses espaos em branco podem ser caracteres de tabulao
ou os espao em branco. No caso do comando ls, sero exibidas as colunas contendo dono do arquivo,
grupo a que pertence o arquivo e nome do arquivo. Note que foi usado o sistema de pipeline, isto , passando
a sada do comando ls para o programa AWK.
Veja este exemplo especfico:
awk '/#/ {print "Linha com comentrio"}' /etc/hosts
O exemplo anterior ir procurar, dentro de cada linha do arquivo /etc/hosts o caractere numeral (#) em
qualquer posio. Se pelo menos um caractere for encontrado, ser exibida a mensagem Linha com
comentrio para cada linha onde o caractere existir.


Korn Shell Script Treinamento bsico em programao
56


Encontrando todos os padres procurados em uma linha.
O AWK poder processar todos os padres encontrados na linha corrente. Portanto, se o programa a seguir
for usado
awk '
/#/ {print "Got a comment"}
$1 == "#" {print "got comment in first column"}
/^# / {print "Found comment at beginning"}
' /etc/hosts
ir exibir, supondo as linhas como as exemplificadas abaixo, as seguintes mensagens:
3 (trs) mensagens para a linha
# Esta e uma linha comentada
2 (duas) mensagens para a linha
# Esta linha est comentada e indentada
e somente 1 (uma) sada para a linha
1.2.3.4 hostname # comentrio no final da linha
Mais exemplos de uso da linguagem AWK e suas declaraes
Os exemplos a seguir so uma traduo do manual do AWK encontrado no endereo da Internet
http://www.gnu.org/software/gawk/manual/gawk.html, onde voc poder achar mais
detalhes e exemplos sobre o uso do AWK, pois trata-se de um manual completo da linguagem e de seu uso,
possuindo muitos exemplos.
Arquivos de dados usados nos exemplos
Para que os resultados mostrados possam ser praticados por voc, crie os arquivos BBS-list e
inventory-shipped como mostrados abaixo:
Arquivo BBS-list
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
bites 555-1675 2400/1200/300 A
camelot 555-0542 300 C
core 555-2912 1200/300 C
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C

Korn Shell Script Treinamento bsico em programao
57


No arquivo BBS-list, cada registro contm o nome do computador do BBS, o nmero a ser discado, as
taxas de transmisso (baud-rate) e um cdigo para o nmero de horas em que ele estar disponvel. Um A na
ltima coluna significa que ele est disponvel 24 horas por dia. Um B significa que o computador estar
disponvel somente a noite e nos finais de semana. Um C significa que o computador do BBS funcionar
somente nos finais de semana.
Arquivo inventory-shipped
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401

Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
No arquivo inventory-shipped representado o nmero de mercadorias enviadas durante o ano. Cada
registro contm o ms do ano, a quantidade de engradados enviados, a quantidade de caixas vermelhas
enviadas, a quantidade de sacos laranjas enviados e o nmero de pacotes azuis que foram enviados naquele
ms. Existem 16 entradas cobrindo os 12 meses do ano e 4 meses do ano seguinte.
Iniciando com o awk
A funo bsica do awk pesquisar em arquivos por linhas (ou outras unidades de texto) que contenham
certos padres. Quando uma das linhas coincide com o padro, o awk executa uma ao especfica naquela
linha. O awk ir processar cada linha do arquivo at o seu final.
Um programa awk consiste em uma srie de regras. Inclusive pode-se definir mdulos chamados funes,
que um tpico mais avanado que no ser coberto neste livro.
Sintaticamente, uma regra consiste de um padro a ser procurado, sendo que este ser seguido por uma ao
a ser executada quando o padro for encontrado. As aes so includas entre chaves para que fiquem
separadas do padro sendo pesquisado. As regras so geralmente separadas por mudanas de linha. Portanto,
um programa awk se parece com a sintaxe abaixo:
padro { ao }
padro { ao }
...


Korn Shell Script Treinamento bsico em programao
58


Como so executados os programas awk
Existem vrias maneiras de se executar um programa awk. Se o programa pequeno, mais fcil inclu-lo
na linha de comando, como no exemplo abaixo:
awk 'program' input-file1 input-file2 ...
Quando o programa muito grande, mais conveniente coloc-lo em um arquivo e executa-lo com um
comando coma sintaxe abaixo:
awk -f program-file input-file1 input-file2 ...
Um exemplo bastante simples
O programa a seguir faz uma pesquisa pela string de caracteres "foo" no arquivo BBS-list.
awk '/foo/ { print $0 }' BBS-list
Quando as linhas contendo a string foo so encontradas, elas so impressas, pois print $0 significa
imprima a linha corrente. Somente o comando print surte o mesmo efeito. Note que a expresso regular a
ser pesquisada dever estar envolvida por duas barras. Veja abaixo o resultado obtido com a execuo do
programa acima:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C
Um exemplo com duas regras de pesquisa
O utilitrio awk l uma linha de cada vez do arquivo de entrada. Para cada linha, o awk testa os padres de
cada regra. Se vrios padres coincidem ento vrias aes so executadas na ordem em que elas aparecem
no programa awk. Se nenhum padro coincide, nenhuma ao executada.
Aps processar todas as regras coincidentes na linha, o awk l a prxima linha. Isso continuar at que o
final do arquivo seja alcanado. Veja o exemplo:
/12/ { print $0 }
/21/ { print $0 }
O exemplo acima contm duas regras: uma procura pela string 12 e a outra pela string 21. Se uma linha
contm ambas as strings elas sero impressas duas vezes, uma para cada regra. Se voc executar o exemplo
acima atuando nos arquivos de dados de exemplos - BBS-list e inventory-shipped - como
mostrado a seguir:
awk '/12/ { print $0 }
/21/ { print $0 }' BBS-list inventory-shipped
Korn Shell Script Treinamento bsico em programao
59


obteramos a seguinte sada:
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
bites 555-1675 2400/1200/300 A
core 555-2912 1200/300 C
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C
sabafoo 555-2127 1200/300 C
Jan 21 36 64 620
Apr 21 70 74 514
Note que a linha do arquivo BBS-list que contm a string sabafoo foi impressa duas vezes, uma para
cada regra.
Programas awk executveis
Uma vez que voc aprendeu com usar o awk, pode ser que voc queira escrever scripts que possam ser
executados simplesmente digitando-se o nome do programa. Para que isso possa ser possvel, voc poder
usar a sintaxe do mecanismo de script, que consiste em colocar na primeira linha do programa os smbolos
#!.
Por exemplo, voc poderia criar um arquivo chamado hello.awk, contendo as seguintes linhas:
#!/bin/awk f
# A simple awk program
BEGIN {print "Hello, world"}
Aps tornar este programa executvel (com o comando chmod) voc pode simplesmente digitar no prompt
de comando do Unix:
hello.awk
Isto ser interpretado como awk f hello.awk.
Programas awk executveis so teis quando se desejado que o usurio execute o programa simplesmente
digitando seu nome, sem que ele conhea que o programa foi escrito em awk.
Comentrios tambm podem ser adicionados aos programas awk. Usa-se o smbolo numeral (#) para colocar
comentrios nas linhas desejadas, da mesma maneira como nos Scripts-Shell. Isso facilitar a vida do
programador, pois posteriormente quando for necessria uma manuteno, os comentrios ajudaro a
entender melhor a lgica que foi usada no desenvolvimento do programa, mesmo que no seja voc quem ir
dar manuteno nele.
Korn Shell Script Treinamento bsico em programao
60


Caso deseje aprender mais sobre o awk, consulte o endereo citado no incio do mdulo. Nele ser
encontrado o manual completo da linguagem, onde voc ver que trata-se de uma linguagem poderosa no
auxlio ao tratamento de dados obtidos partir de arquivos textos diversos.
Korn Shell Script Treinamento bsico em programao
61


Mdulo 9 - Comandos do Unix teis para a programao script-Shell
Sero apresentados neste mdulo alguns comandos do Unix teis para a manipulao de dados, como por
exemplo obter o tamanho de uma string, obter uma sub-string, posicionamento do cursor na tela, etc. So
recursos teis, presentes no Unix e que podem facilitar o desenvolvimento de Scripts-Shell, pois o Unix foi
criado com a filosofia de que as ferramentas possam ser combinadas para a obteno do resultado desejado.
Obtendo o comprimento de uma string - ${#VARIVEL}
Pode haver a necessidade de se precisar contar quantos caracteres existem em uma determinada string,
principalmente quando trabalhamos com variveis de ambiente. O comando ${#VARIVEL} pode ajuda-lo
nesta tarefa. Sua sintaxe :

NOME="Rodivaldo Marcelo"
echo ${#NOME}
17

Um exemplo de uso em scripts quando queremos checar se em uma determinada varivel recebeu a
quantidade de caracteres correta atravs do comando read. Veja o exemplo, em que checado se a entrada
do cdigo de cliente menor do que 1 ou maior do que 5:

while true;do
echo "Entre com o cdigo do cliente:\c"
read CODICLI

TAMCOD=${#CODICLI}
if [ $TAMCOD lt 1 o $TAMCOD ge 5 ];then
echo "Cdigo ter entre 1 e 5 caracteres de tamanho...\a"
else
exit
if
done
Extraindo sub-cadeias de caracteres de uma string - expr substr
Existem duas maneiras bsicas de se extrair partes de uma string. Existem dois comandos no Unix que
podem ser usados para isso. Um o comando expr substr e o outro o comando cut, sendo que este
ltimo apesar de ser usado para arquivos de dados, pode ser usado tambm para a extrao de caracteres de
uma string.
O comando expr substr possui a seguinte sintaxe:
expr substr string Incio Qtde
string Texto a se extrado a string. Pode ser uma varivel ou um literal, mas deve estar entre aspas
Incio Posio inicial onde ser iniciada a extrao
Qtde Quantidade de caracteres a serem extrados a partir de Incio.
Korn Shell Script Treinamento bsico em programao
62


Exemplo:

CODCLI=12532256
expr substr "$CODCLI" 1 3
125
expr substr "$CODCLI" 4 5
32256
A sintaxe do comando cut para a extrao de caracteres :
echo string|cut cIncio-Fim
onde:
string Texto a se extrado a string. Pode ser uma varivel ou um literal. Neste caso estar entre aspas
opcional, pois a cadeia de caracteres ser passada para o comando cut atravs de pipeline.
Incio Posio inicial onde ser iniciada a extrao. A opo -c obrigatria para o comando cut.
Fim Posio onde terminar a extrao. Se for omitida, a extrao ser feita at o final da string.

Veja o exemplo anterior, agora usando o comando cut:

CODCLI=12532256
echo $CODCLI|cut -c1-3
125
echo $CODCLI|cut c4-8
32256

Veja, a seguir, dois exemplos do mesmo programa, um com o comando expr substr e o outro com o
comando cut. Os dois mostram o cdigo do cliente em um banco, onde os 3 primeiros caracteres
identificam a agencia e os 5 ltimos a conta corrente.

Exemplo 1:

echo "Digite o codigo do cliente: \c"
read CODCLI

CODAGEN=$(expr substr "$CODCLI" 1 3)
CODCONT=$(expr substr "$CODCLI" 4 5)

echo "Codigo da agencia......: $CODAGEN"
echo "Conta corrente.........: $CODCONT"

Exemplo 2:

echo "Digite o codigo do cliente: \c"
read CODCLI
Korn Shell Script Treinamento bsico em programao
63



CODAGEN=$(echo $CODCLI|cut -c1-3)
CODCONT=$(echo $CODCLI|cut -c4-)

echo "Codigo da agencia......: $CODAGEN"
echo "Conta corrente.........: $CODCONT"
Removendo espaos em branco - tr -s " "
Sempre nos deparamos com casos em que determinadas cadeias de caracteres possuem mais de um espao
em branco, como no caso de um arquivo de dados que pode conter vrios campos em um registro, separados
por espaos ou tabulaes, porm h mais de um espao entre os campos. Podemos resolver este problema
com o comando tr s " " - atravs de pipeline - que far com que a string com excesso de espaos seja
transformada em uma string com espaos simples. Veja:

REGISTRO="005-001 Jose Carlos Sao Paulo Brasil"
echo $REGISTRO
005-001 Jose Carlos Sao Paulo Brasil
echo $REGISTRO|tr -s " "
005-001 Jose Carlos Sao Paulo Brasil

No exemplo de programa Shell a seguir, feito um processamento de arquivo em que so removidos os
espaos excessivos de todos os registros, mostrando no final, a quantidade de registros processados:

echo "Incio do processamento do arquivo clientes.dat\a"
echo "Aguarde..."

touch dados.tmp

tr -s " " < dados.dat >>dados.tmp

CONTAREG=$(cat dados.dat|wc -l)

rm dados.dat
mv dados.tmp dados.dat

echo '-------------------------------------------------'
echo "Total de registros processados ==> " $CONTAREG
echo '-------------------------------------------------'
Trocando as letras - tr "[a-z]" "[A-Z]" e tr "[A-Z]" "[a-z]"
Outra utilidade do comando tr a capacidade de fazer a transformao de letras maisculas para minsculas
e vice-versa. Poder ser usado este recurso em caso seja necessrio passar um arquivo por um tratamento de
converso de caracteres antes de ser submetido a um processamento.
Pode-se us-lo tanto na leitura direta de um arquivo - atravs do redirecionamento de entrada/sada - como
atravs de pipeline, seja atravs do comando echo ou do comando cat - como nos exemplos a seguir.
Korn Shell Script Treinamento bsico em programao
64


Exemplo 1 - criao do arquivo dados.mai, em maisculas, partir do arquivo dados.ori:
tr "[a-z]" "[A-Z]" < dados.ori >dados.mai
Exemplo 2 - criao do arquivo dados.min, em minsculas, partir do arquivo dados.ori:
tr "[A-Z]" "[a-z]" < dados.ori >dados.min
Exemplo 3 - criao do arquivo dados.mai, em maisculas, usando o comando cat:
cat dados.ori|tr "[a-z]" "[A-Z]" >dados.mai
Exemplo 4 - converso de uma string contendo letras minsculas em maisculas usando echo:
TEXTO='esta variavel possui uma String com letras minusculas'
echo $TEXTO
esta variavel possui uma String com letras minusculas
TEXTO=$(echo $TEXTO|tr "[a-z]" "[A-Z]")
echo $TEXTO
ESTA VARIAVEL POSSUI UMA STRING COM LETRAS MINUSCULAS
Observe o programa a seguir, onde feita a converso de letras minsculas para maisculas e, ao final,
mostrada a quantidade de registros processados:
echo "Convertendo todas as letras para maiusculas... Aguarde"
tr "[a-z]" "[A-Z]" < cobranca.dat >cobranca.tmp
mv cobranca.tmp cobranca.dat
echo "Total de registros: $(cat cobranca.dat|wc -l)"

Para mais detalhes sobre as opes de transformao de caracteres, recorra ao manual on-line do comando,
digitando no prompt do Unix man tr.
Colocando o cursor em uma determinada posio - tput cup
Quem pensa que no possvel, no Unix, fazer um Shell-script apresentvel, onde se pode posicionar uma
mensagem em qualquer parte da tela, pode at se impressionar, pois existe o comando tput cup que
permite fazer isso, no ficando o programador restrito apenas s estruturas de controle e seqncias de
comandos.
O comando tput cup possui a seguinte sintaxe:
tput cup Lin Col
onde:
Lin - linha da tela onde ser posicionado o cursor. Vai de 0 a 79.
Col - coluna da tela onde ser posicionado o cursor. Vai de 0 a 24.
O exemplo a seguir ilustra um menu de duas opes onde a mensagens e textos em tela esto posicionados de
maneira a deixar a execuo do script mais apresentvel e profissional:
Korn Shell Script Treinamento bsico em programao
65


# Menu de opcoes do sistema

while true;do
tput cup 02 15; echo "MENU DE OPCOES"

tput cup 06 15; echo "d - mostra data e hora"
tput cup 08 15; echo "w - para mostrar usurios logados"
tput cup 10 15; echo "l - para listar o contedo do \
diretorio corrente"

tput 20 15; echo "Por favor entre com sua opcao - ENTER para
sair: \c"
read OPCAO

case $OPCAO in
[dD]) date
;;
[wW]) who
;;
[lL]) ls
;;
*) exit
;;
esac
done
clear
Definindo um formato de sada para os dados - comando printf
Algumas formataes de dados tambm podem ser efetuadas com comandos do Unix em Scripts-Shell. Pode-
se fazer alinhamento esquerda, direita e inclusive, em alguns tipos de arquivos de dados, preencher strings
(cdigos ou nmeros) com zeros esquerda.
Para que possamos obter esses resultados na formatao de dados, usaremos o comando printf, que para
os que esto acostumados com a linguagem C, no sentiro dificuldade no seu uso, pois usa grande parte dos
comandos de formatao do comando original da linguagem C. No caso iremos cobrir as formataes que
permitem alterar o alinhamento do texto (esquerda ou direita) e o preenchimento de strings com zeros
esquerda. O comando printf no faz mudana automtica de linha aps a exibio do valor a ser
formatado. Se isso for necessrio, no final da formatao deve-se colocar o caractere de controle \n, que tem
a funo de mudana de linha (newline).
Alinhando strings direita ou esquerda
O comando printf pode ser usado para alterar o alinhamento na apresentao de uma string, seja ela
literal ou varivel de ambiente, numrica ou no. Com relao a valores numricos, geralmente eles ficam
melhores alinhados direita, enquanto outros tipos de textos ficam melhor apresentados alinhados
esquerda.
A sintaxe do comando printf, para tratamento de alinhamentos, a seguinte:
Korn Shell Script Treinamento bsico em programao
66


printf "%Ns" valor/string - alinhamento direita
printf "%-Ns" valor/string - alinhamento esquerda
onde:
N - o tamanho que dever ter o elemento a ser alinhado. Se for menor do que a quantidade de caracteres
definida em N, ser preenchido por espaos em brancos. Exemplos:

NOMECLI='Coca-Cola Inc.'
FATUCLI='2556779,32'

printf "%-20s" $NOMECLI
Coca-Cola Inc.
printf "%20s" $NOMECLI
Coca-Cola Inc.

printf "%-15s" $FATCLI
2556779,32
printf "%15s" $FATCLI
2556779,32
Preenchendo strings com zeros esquerda
Outra opo de formatao muito til do comando printf a capacidade de preencher uma string
numrica com zeros esquerda. Deve ser um nmero inteiro. Geralmente essa capacidade ser til com
string composta de nmeros, como por exemplo em arquivos textos que devero ser processados por outros
programas ou ser enviados por teleprocessamento, sendo que os aplicativos que trataro esses nmeros
podem exigir que no lugar dos espaos em branco esquerda do nmero, sejam colocados zeros para
preenchimento desse espao.
A sintaxe usada para o comando printf para efetuar o preenchimento de zeros a esquerda :
printf "%.Nd" valor/string
onde:
N - o tamanho que dever ter a string. Se a valor/string for menor do que o especificado em N, o espao
excedente ser preenchido por zeros. Exemplo:

VALOR='25896544'
printf "%.12d" $VALOR
000025896544

SALDO='25'
printf "%.15d" $SALDO
000000000000025

Korn Shell Script Treinamento bsico em programao
67


Efetuando uma pausa no processamento do script - sleep
Nos mdulos anteriores h exemplos do comando sleep. Esse comando tem a funo de dar uma pausa no
processamento durante um determinado nmeros de segundos. Logo aps o processamento volta a continuar.
Este comando bastante til no caso de se precisar mostrar mensagens durante um determinado tempo para o
usurio ter tempo de ler, ou ento quando queremos que um processamento fique em execuo dentro de uma
estrutura de loop, mas queremos controlar de quanto em quanto tempo o processamento do loop deve ser
retomado. Sua sintaxe simples:
sleep segundos
No exemplo abaixo, o administrador do sistema (root) envia uma mensagem a cada 1 minuto para todos os
usurios, durante 10 minutos, avisando que o servidor ser desligado:
CTMIN=0
while (( CTMIN <= 10 ));do
echo "O servidor saira do ar para manutencao ! ! !"|wall
echo "Por favor encerrem seus trabalhos e deem logout..."|wall

(( CTMIN = CTMIN + 1))
sleep 60
done
Korn Shell Script Treinamento bsico em programao
68


Mdulo 10 - Exemplos de Scripts-Shell teis
Limitando a quantidade de sesses simultneas dos usurios - unico_login.sh
Este script visa limitar cada usurio a ter somente uma sesso de terminal ativa. Os usurios que precisarem
ter mais de uma sesso de login devero estar cadastrados no arquivo de dados (arquivo tipo texto)
usuarios.podem.logar. Cada linha dever ter somente um logname.
# ----------------------------------------------------
# Programa unico_login.sh
# Procura a ocorrncia de $LOGNAME no arquivo de dados
# ----------------------------------------------------
MAISDE1LOGIN=$(grep -x $LOGNAME usuarios.podem.logar)

# ----------------------------------------------------
# Se o nome no foi encontrado, conta a quantidade de
# sesses de terminal ativas de $LOGNAME
# ----------------------------------------------------
if [ "$MAISDE1LOGIN" != "$LOGNAME" ]; then

JALOGADO=$(who|cut -c1-10|tr -s " "|grep -x "$LOGNAME "|wc -l)

#--------------------------------------------------------------
# Se a quantidade de sesses de terminal for maior do que 1,
# o usurio avisado por uma mensagem, aguardado 3 segundos
# e a sesso extra cancelada
#--------------------------------------------------------------
if [ $JALOGADO -gt 1 ]; then

echo "Voce ja esta logado como $LOGNAME no sistema...\a"
echo
echo "Fechando conexao extra...."

sleep 3
exit
fi
fi

Acrescente ao arquivo /etc/profile, de preferncia na primeira linha dele, a seguinte linha de comando:

. unico_login.sh


Korn Shell Script Treinamento bsico em programao
69


Calculando a diferena entre intervalos de tempo - diftempo.sh
Com este script, apresentado em forma de funo a ser chamada por qualquer outro script, voc poder saber
quanto tempo leva um determinado processamento. O resultado da funo mostrado no formato
HH:MM:SS, podendo ser armazenado para uso pelo mtodo de substituio de varivel ou substituio de
comando. Ela composta das funes segundos e diftempo. A sintaxe desta funo :
diftempo Incio Fim, onde:
Incio - Varivel onde estar armazenada a hora inicial do processo. Antes de comear o processo, armazene
a hora inicial da seguinte maneira: HORAINI=$(date +"%H:%M:%S).
Fim - Varivel onde estar armazenada a hora final do processo. Aps o trmino do processo, armazene a
hora final da seguinte maneira: HORAFIN=$(date +"%H:%M:%S).

# -----------------------------------------------
# Funo segundos - transforma a hora em segundos
# -----------------------------------------------

segundos ()
{
set +u

# ---------------------------------------------------
# Se for passada hora em branco, considera meia-noite
# ---------------------------------------------------
TEMPO=$1
if [ "$TEMPO" = "" ];then
TEMPO="00:00:00"
fi

# --------------------------------------------
# Separa hora, minutos e segundos em variveis
# --------------------------------------------
VAR1=$(echo $TEMPO|cut -d: -f1)
VAR2=$(echo $TEMPO|cut -d: -f2)
VAR3=$(echo $TEMPO|cut -d: -f3)

# --------------------------------------------
# Retorna a hora transformada em segundos para
# a funo diftempo convertendo de sexagesimal
# para decimal
# --------------------------------------------
echo "($VAR1*3600)+($VAR2*60)+($VAR3*1)"|bc
set -u
return 0
}
Korn Shell Script Treinamento bsico em programao
70



# -----------------------------------------------
# Funo para calcular a diferena de tempo entre
# duas horas passadas como parmetro
# -----------------------------------------------

diftempo ()
{
# ---------------------------
# Total de segundos em um dia
# ---------------------------
TOTSEGDIA=86400

# -------------------------------------------
# Transforma hora inicial e final em segundos
# -------------------------------------------
HORA1=$(segundos $1)
HORA2=$(segundos $2)

# -----------------------------------------------
# Se passou da meia-noite na hora final, adiciona
# $TOTSEGDIA hora final
# -----------------------------------------------
if [ $HORA2 -lt $HORA1 ];then
HORA2=$(echo "$HORA2+TOTSEGDIA"|bc)
fi

# -------------------------------------------------
# Calcula a diferena entre a hora inicial e final
# -------------------------------------------------
(( FINAL = HORA2 - HORA1 ))

# ---------------------------------------------
# Converte de a diferena entre as horas para o
# formato sexagesimal
# ---------------------------------------------
VHORA=$(echo "($FINAL/3600)%24"|bc)
VHORA=$(printf "%.2d" $VHORA)

VMINU=$(echo "($FINAL/60)%60"|bc)
VMINU=$(printf "%.2d" $VMINU)

VSEGU=$(echo "($FINAL%60)"|bc)
VSEGU=$(printf "%.2d" $VSEGU)

# ---------------------------------------------
# Exibe a diferena entre horas inicial e final
# ---------------------------------------------
Korn Shell Script Treinamento bsico em programao
71


echo "$VHORA":"$VMINU":"$VSEGU"
}

Abaixo mostro exemplo de como usar o script diftempo.sh para saber quanto tempo levar para serem
removidos arquivos com o nome core de todos os diretrios onde forem encontrados, usando o comando
find:

# -------------------
# programa delcore.sh
# -------------------
. diftempo.sh # Carrega o arquivo com as funes de clculo
# de diferena de horas

HORAINI=$(date +"%H:%M:%S") # Armazena hora inicial

echo "Removendo arquivos CORE do servidor... Aguarde\a"

find / -name core -exec rm -f {} \; # Procura e remove CORES

HORAFIN=$(date +"%H:%M:%S") # Armazena hora do trmino

echo "Remocao de arquivos CORE terminada"
echo "---------------------------------"
echo "Tempo total do processo: $(diftempo $HORAINI $HORAFIN)
echo "---------------------------------"
echo


Korn Shell Script Treinamento bsico em programao
72


Pontuando valores maiores que 999 - pontuar.sh
Leia este nmero rapidamente: 122569883698944.
bem mais difcil do que ler o mesmo nmero com a pontuao: 122.569.883.689.944.
O script mostrado abaixo tem a funo de pontuar nmeros acima de 999, colocando os pontos a cada grupo
de trs dgitos.

pontuar ()
{
# Se no for passado o numero a pontuar
# sai da funo
VALOR=$1
if [ "$VALOR" = "" ];then
return
fi

# Calcula o tamanho da string passada
TAMSTR=${#$VALOR}

CTRCAR=$TAMSTR
CTAPTO=0
NUMPTO=""

# Coloca ponto entre grupos de 3 nmeros
# de tras para frente
#
while (( $CTRCAR >= 1 ));do
NUMPTO=$NUMPTO$(printf $(expr substr "$VALOR" $CTRCAR 1))

(( CTRCAR = $CTRCAR - 1 ))
(( CTAPTO = $CTAPTO + 1 ))

if [ $CTAPTO -eq 3 -a $CTRCAR -ge 1 ];then
NUMPTO=$NUMPTO$(printf ".")
CTAPTO=0
fi
done

# Obtm o tamanho da string pontuada
TAMSTR=${$NUMPTO}

CTRCAR=$TAMSTR
NUMERO=""

# Volta os digitos pontuados para
# a ordem original
#
Korn Shell Script Treinamento bsico em programao
73


while (( $CTRCAR >= 1 ));do
NUMERO=$NUMERO$(printf $(expr substr "$NUMPTO" $CTRCAR 1))

((CTRCAR = $CTRCAR - 1 ))
done

# Exibe o numero pontuado
echo $NUMERO
}

O script abaixo mostra o comando df -k com os valores referentes aos filesystems com pontuao,
melhorando a qualidade de exibio dos nmeros.

# ------------------
# programa newdf.sh
# ------------------

. pontuar.sh

# Cabecalho de colunas de tela
#
cabecalho ()
{
clear

tput cup $LIN $COL01; printf "Log.Volume"
tput cup $LIN $COL02; printf "Tot. Size"
tput cup $LIN $COL03; printf "Used Size"
tput cup $LIN $COL04; printf "Free Size"
tput cup $LIN $COL05; printf "P.Used"
tput cup $LIN $COL06; printf "Filesystem"

(( LIN = $LIN + 1 ))

tput cup $LIN $COL01; printf "============"
tput cup $LIN $COL02; printf "==========="
tput cup $LIN $COL03; printf "==========="
tput cup $LIN $COL04; printf "==========="
tput cup $LIN $COL05; printf "===="
tput cup $LIN $COL06; printf "================="

LIN=02

}

COL01=00
COL02=13
Korn Shell Script Treinamento bsico em programao
74


COL03=25
COL04=37
COL05=50
COL06=57

LIN=00

cabecalho

# ----------------------------
# Obtem dados do comando df -k
# ----------------------------
for REGISTRO in $(df -k|grep -v Filesystem|tr -s " "|tr " " ":");do
VOLLOG=$(echo $REGISTRO|cut -d: -f1)
TAMTOT=$(pontuar $(echo $REGISTRO|cut -d: -f2))
ESPUSO=$(pontuar $(echo $REGISTRO|cut -d: -f3))
ESPLIV=$(pontuar $(echo $REGISTRO|cut -d: -f4))
PERLIV=$(echo $REGISTRO|cut -d: -f5)
PTMONT=$(echo $REGISTRO|cut -d: -f6)

tput cup $LIN $COL01; printf $VOLLOG
tput cup $LIN $COL02; printf "%11s" $TAMTOT
tput cup $LIN $COL03; printf "%11s" $ESPUSO
tput cup $LIN $COL04; printf "%11s" $ESPLIV
tput cup $LIN $COL05; printf "%03s" $PERLIV
tput cup $LIN $COL06; printf $PTMONT

(( LIN = $LIN + 1 ))
if [ $LIN -gt 20 ];then
LIN=02
clear
fi
done

echo


Korn Shell Script Treinamento bsico em programao
75


Cadastro de scripts Shell desenvolvidos - utilitarios.sh
s vezes desenvolvemos tantas ferramentas com a linguagem Shell que acabamos nos perdendo entre tantos
scripts e tantas sintaxes. Para facilitar sua vida, voc pode usar este script onde poder catalogar o nome do
script e sua sintaxe bsica, como um comando man personalizado.
Este script depender do arquivo utilitarios.dados, que conter o nome do script e sua descrio,
separados por um ponto-e-vrgula.
mostrado um limite de 20 linhas por tela. Se a tela encher, pressione e ee e para continuar lendo a tela. Para
sair pressione Q ou X.
# ------------------------
# Programa Utilitrios.sh
# ------------------------
rot_cab ()
{
tput cup 00 $COL01; echo "Utilitarios para uso \
da operacao/suporte"
tput cup 01 $COL01; echo "Comando"
tput cup 01 $COL02; echo "Utilidade e sintaxe"

POS=2
linhas
}

linhas ()
{
tput cup $POS $COL01; echo "--------------"
tput cup $POS $COL02; echo "---------------\
----------------------------------"
}

mensagem ()
{
echo "Itens entre [ e ] sao opcionais, itens \
entre < e > sao obrigatorios"
echo "[ENTER]-Proxima Q/X-Sair"
}

comando ()
{
case $COMANDO in
q|Q|x|X) echo " "
exit
;;
*) POS=3
tput cup $POS 01;tput ed
esac
Korn Shell Script Treinamento bsico em programao
76


}
COL01=02
COL02=17
COL03=32
COL04=39
COL05=46
COL06=61

USUARIO=$1
while true;do
clear

CTLIN=1
rot_cab

POS=3

for REGISTRO in $(cat utilitarios.dados|sort|tr " " "_");do

COMANDO=$(echo "$REGISTRO" | cut -d\; -f1)
UTILIZA=$(echo "$REGISTRO" | cut -d\; -f2)

tput cup $POS $COL01; echo $COMANDO
tput cup $POS $COL02; echo $(echo $UTILIZA|tr "_" " ")

(( POS = $POS + 1 ))
if [ $POS -eq 20 ];then
linhas

mensagem
read COMANDO
comando

clear
rot_cab
POS=3
fi
done

if [ $POS -lt 20 ];then
linhas
fi

mensagem
read COMANDO
comando
done
Korn Shell Script Treinamento bsico em programao
77


Agenda de contatos e/ou ramais internos - agenda.sh
Com este script simples, voc poder sempre ter mo os nmeros de telefones, tanto de ramais internos
quanto de contatos. Os dados a serem pesquisados devem ser includos no arquivo
agenda.uso.interno.
Neste arquivo os dados pode ser colocados livremente, pois o script executar um comando grep em
agenda.uso.interno. Por exemplo, para localizar o ramal do departamento de Contabilidade, supondo
que esteja cadastrado no arquivo de dados, digite:
agenda.sh contabilidade
Ser procurado no arquivo todas ocorrncias da string contabilidade, indiferente de ser maiscula ou
minscula. Se for digitado somente agenda.sh, ser mostrado todo o contedo do arquivo de dados
paginado em tela.
# -------------------
# Programa agenda.sh
# -------------------
echo
echo

if [ "$1" = " " ];then
more -e agenda.dat
else
grep -i "$1" agenda.uso.interno|more -e
fi


Korn Shell Script Treinamento bsico em programao
78


Apndice A - Endereos Internet referentes a Unix
Manual de IBM-AIX

http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/infoc
enter/base/aix53.htm


Manual da linguagem AWK

http://www.gnu.org/software/gawk/manual/gawk.html


Criando programas e comandos usando o Shell

http://www.klingon.com.br/unix/unix.html


Pgina do AIX

http://www.rootvg.com
Korn Shell Script Treinamento bsico em programao
79


Apndice B - Referncia de comandos Unix teis em scripts
bc - Calculadora binria
Pode ser usada em modo interativo, assim como aceita que sejam passados expresses via pipeline. Muito
til para fazer clculos quando para fazer converses de bases.
No modo interativo, digite bc no prompt de comandos do Unix e efetue clculos normalmente. Seus
operadores bsicos so:
+ - Soma
- - Subtrao
* - Multiplicao
/ - Diviso
^ - Potncia
() - parnteses para agrupamento
% - Mdulo (resto da diviso)
scale=N - quantidade de casas decimais no resultado, onde N o nmero de casas decimais desejadas.
ibase=N - Base numrica de entrada. N a base desejada. O default base 10.
obase=N - base numrica de sada. N a base desejada. O default 10.
possvel escrever programas parecidos com a liguagem C, envolvendo clculos, para serem executados
diretamente na calculadora. Tambm esto disponveis vrias funes como raiz quadrada, seno, tangente,
etc. Veja o manual on-line para mais detalhes. Exemplos de uso no modo interativo:
scale=5 - 5 casas decimais
125/33
3.78788
ibase=10 - Entrada em base 10
obase=16 - Sada em base 16
9
9
10
A
13
D
15
F
16
10
2+3*5
17 - Ordem de clculo obedece a regra matemtica
(2+3)*5 - Usa-se parnteses para alterar a ordem do clculo
Korn Shell Script Treinamento bsico em programao
80


25
3%2 - Resto da diviso os nmeros
1
Veja agora os mesmos exemplos, agora usando o mtodo de pipeline:

$ echo 'scale=5;125/33'|bc
3.78787
$ echo 'ibase=10;obase=16;9;10;13;15;16'|bc
9
A
D
F
10
$ echo '2+3*5;(2+3)*5'|bc
17
25
$ echo '3%2'|bc
1
O ponto-e-vrgula (;), como verificado acima, serve como separador de linhas, permitindo colocar-se mais
de uma expresso em uma mesma linha.
cut - Exibio de campos ou colunas
Este comando geralmente usado para exibir campos ou colunas em registros de arquivos. Porm, usando o
mtodo pipeline, pode ser usado para exibir sub-strings de expresses caractere.
Esta a sintaxe para a exibio de colunas de arquivos :
cut -cColunas arquivo
onde:
Colunas - so as colunas que devem ser exibidas das linhas do arquivo, pode ser especificada listas de
colunas individuais (separadas por vrgulas) ou faixas de colunas (especificadas por hfen). Podem ser
combinados tanto listas de colunas como faixas.
Para a exibio de campos, utiliza-se a seguinte sintaxe:
cut -dDelimitador -fCampos arquivo
Delimitador - o tipo de delimitador usado para separar os campos do registros. Se no for informado, por
default considerado como sendo espao ou tabulao.
Campos - so os elementos separados pelo delimitador especificado. Podem ser especificados listas de
campos (separados por vrgulas) ou faixas de campos (especificadas por hfen). Podem ser combinados tanto
listas de campos como faixas.
Korn Shell Script Treinamento bsico em programao
81


Vale esclarecer que independente do tipo de extrao usada (campos ou colunas), os dados sero exibidos na
ordem em que os dados se encontram no arquivo, independente da ordem em que a lista de campos ou
colunas sejam especificados para as opes -c (para colunas) ou -f (para campos).
Veja alguns exemplo do uso do comando cut, usando campos ou colunas, pelo mtodo de leitura de arquivo
ou de um pipeline:
cut -d: -f1,3,7-9,13-15,21,22 dados.dos.clientes
O exemplo acima exibe os campos de ordem 1,3, de 7 9, de 13 15, 21 e 22 do arquivo
dados.dos.clientes, sendo que os registros do arquivo so separados por dois-pontos (:).
cut -c4-7,9,2,32-55 remessa.1000
No exemplo anterior so mostradas as colunas 2, da 4 at a 7, a 9 e da 32 at a coluna 55 do arquivo
remessa.1000. Como dito anteriormente, apesar das colunas estarem sendo passadas fora de ordem para a
opo -c do comando cut, elas sero apresentadas na seqncia em que aparecem no arquivo de dados.
No exemplo a seguir demonstrado o uso do comando cut com o mtodo de pipeline para criar variveis
com partes do contedo da varivel REG, que contm o registro armazenado, assim como demonstrado o
seu uso com o mtodo de substituio de comandos:
REG='Clinton#Presidente dos EUA#55 anos#Hillary Clinton#Al Gore'

NOME=$(echo $REG|cut -d# -f1)
CARGO=$(echo $REG|cut -d# -f2)
ESPOSA=$(echo $REG|cut -d# -f4)

echo "O $CARGO $NOME casado com $ESPOSA, tendo como vice"
echo "o Sr. $(echo $REG|cut -d# -f5)."
echo "Sua idade $(echo $REG|cut -d# -f3)."
expr length - Retorna o tamanho de uma string
Este comando permite que voc saiba o comprimento de uma string (literal ou varivel) passada como
parmetro, isto , a quantidade de caracteres contida na string. Exemplos:

expr length 'Curso de Programao Shell para HP-UX e Linux'
45

AUTOR='Jos de Alencar'
echo "O tamanho da varivel string AUTOR \
$(expr length "$AUTOR") caracteres."
O tamanho da varivel string AUTOR 15 caracteres.

Veja este exemplo de script onde uma mensagem ser centralizada na tela:

# ---------------------------------------------------------
# Programa center.sh
Korn Shell Script Treinamento bsico em programao
82


# Centraliza mensagens na tela partir da funo center ()
# ---------------------------------------------------------

# =======================
# Funo de centralizao
# =======================
center ()
{
LINHA=$1 # Linha onde ser exibida o texto
TEXTO=$2 # Texto a ser centralizado

TAMAN=$(expr length "$TEXTO") # Armazena tamanho do texto

(( COLUNA = ( 80 - TAMAN) / 2) )) # Calcula com base em
# uma tela de 80 colunas

tput cup $LINHA $COLUNA; echo $TEXTO # Exibe texto

return
}

clear

center 20 'Este texto aparecer no centro da tela...'
center 22 "Meu login name $LOGNAME"

expr substr - Exibe partes de uma string
Este comando permite que sejam extrados uma certa quantidade de caracteres de uma string (varivel ou
literal) partir de uma determinada posio. Sintaxe:

expr substr Texto Incio Qtde

onde:

Texto - literal ou varivel de onde ser extrada a substring.
Incio - posio da string onde ser iniciada a extrao.
Qtde - quantidade de caracteres a ser extrada

Veja o exemplo abaixo, onde lido o arquivo clientes.dat de dados de 60 posies, onde nas 10
primeiras posies est o cdigo do cliente, as 35 subseqntes o nome do cliente e as 15 restantes possui seu
saldo. Sero lidos somente o cdigo do cliente e o saldo. Esse dados sero gravados no arquivo
codsaldo.dat, com os campos separados pelo caractere dois-pontos. No final exibido em tela a
quantidade de registros processados:

# --------------------
Korn Shell Script Treinamento bsico em programao
83


# Programa versaldo.sh
# --------------------

echo "Criando arquivo codsaldo.dat..."

TOTREG=0
for REGISTRO in $(cat clientes.dat);do
CODCLI=$(expr substr "$REGISTRO" 1 10)
SALCLI=$(expr substr "$REGISTRO" 46 60)

echo ${CODCLI}:${SALCLI} >>codsaldo.dat

(( TOTREG = TOTREG + 1 ))
done
echo '---------------------------------------------'
echo "Total de registros processados: $TOTREG"
echo '---------------------------------------------'

printf - Exibe dados (strings ou numricos) formatados
Este comando, similar ao printf da linguagem C, pode ser usado para vrios tipos de formatao de sada
de dados. Mais detalhes podem ser encontrados no manual on-line (digitando man printf). Sua sintaxe
bsica :

printf "formato" string

Pode-se usar vrios formatos dentro das aspas, desde que elas sejam respectivas s strings ou variveis
passadas para serem formatadas. O comando printf no efetua a mudana de linha automtica, sendo
necessrio colocar-se o caractere de controle \n no final do formato.
Abaixo mostro as trs sadas de formatao que mais comumente uso para tratamento de dados e na
formatao de suas sadas:

Alinhamento direita: printf "%Ns" string, onde N o tamanho que a string ter depois de formatada.
Se for menor que N ser completada com brancos.
Exemplo:

NOME='Marcelo'
CIDADE='Sao Paulo'
SISTEMA='Unix'

printf "O Sr. %11s mora em %15s usa %7s \n" "$NOME" "$CIDADE" "$SISTEMA"
O Sr. Marcelo mora em Sao Paulo e usa Unix


Korn Shell Script Treinamento bsico em programao
84


Alinhamento esquerda: printf "%-Ns" string
Veja o exemplo anterior, agora com a formatao alinhando esquerda as variveis passadas como
argumento:

printf "O Sr. %-11s mora em %-15s usa %-7s\n" "$NOME" "$CIDADE"
"$SISTEMA"
O Sr. Marcelo mora em Sao Paulo e usa Unix

Zeros esquerda: printf "%.Nd" Nmero_Inteiro, onde N o tamanho da string resultante de
Nmero_Inteiro. Se Nmero_Inteiro for menor do que N, ser completada com zeros esquerda.

Exemplo:

SALDOANT=1200
DEBITOS=1000
CREDITOS=500
(( SALDO = SALDOANT - DEBITOS + CREDITOS ))
printf "Voce tinha %.06d, gastou %.07d, ganhou %.08d \
e agora possui %.10d\n" $SALDOANT $DEBITOS $CREDITOS $SALDO
Voce tinha 001200, gastou 0001000, ganhou 00000500 e agora possui
0000000700

set -u/+u - Ativa ou desativa o uso de variveis no existentes
set +u - faz com que as variveis no inicializadas assumam o contedo NULL quando estas forem
referenciadas na substituio de variveis.
set -u - Se for usada esta opo, qualquer varivel que no tiver sido inicializada gerar mensagem de erro
quando for feita a sunstituio de variveis usando o nome de uma varivel inexistente.
Estas duas opes permitem que voc controle a existncia ou no de variveis em seus scripts, pois em
alguns casos voc pode ou no necessitar de um script que valide a existencia de variveis, ou seja, se as
variveis chamadas foram ou no declaradas em um determinado ponto de seu programa Shell.
Exemplos:

set +u
echo $CODIGO

set -u
echo $CODIGO
ksh: CODIGO: parameter not set
sleep - Faz uma pausa em segundos
Este comando tem a funo de efetuar uma pausa durante alguns segundo no processamento, continuando o
processo aps esse tempo. Sua sintaxe simples:
Korn Shell Script Treinamento bsico em programao
85



sleep Segundos, onde Segundos a quanditade de segundos em que o processamento deve ficar parado.
Aps este perodo o processamento continua normalmente.
Exemplo:

echo 'Aguardando 5 minutos antes de continuar...'
sleep 300
echo 'J se passaram os 5 minutos... Terminando o processo...'
sleep 2
clear

tput cup - Posicionamento do cursor em tela
Este comando tem a funo de posicionar o cursor em uma determinada coordenada da tela. bastante til
quando queremos posicionas uma determinada mensagem na tela. Sintaxe:

tput cup Linha Coluna, onde:

Linha - posio na tela que vai de 0 a 24
Coluna - posio na tela que vai de 0 a 79

Neste exemplo, a mensagem Processando Dados colocada na tela iniciando na linha 10 e coluna 13:

tput cup 10 13
echo 'Processando Dados'

tput ed - Limpa at o final da tela
Este comando far com que a tela seja apagada da posio atual onde se encontra o cursor at o final da tela.
Sintaxe:

tput ed

Supondo que o cursor foi posicionado na linha 5 e coluna 0, se quisermos limpar a tela deste ponto em
diante, ou seja, at o final da tela, basta usar as seguintes instrues:

tput cup 05 00
tput ed

tput el - Limpa at o final da linha
Este comando far um apagamento da posio atual onde se encontra o cursor at o final da linha onde ele se
posiciona. Sintaxe:

Korn Shell Script Treinamento bsico em programao
86


tput el

Supondo que o cursor foi posicionado na linha 5 e coluna 7, se quisermos apagar deste ponto at o final da
linha corrente, basta usar as seguintes instrues:

tput cup 05 07
tput el

tput blink - Coloca o cursor em modo piscante
Com este comando pode-se ativar o modo piscante do terminal para exibir mensagens piscando na tela. Por
exemplo, para que a mensagem Aguarde fique piscando ao lado da mensagem Processando
Arquivo, use a seqncia de linha abaixo:

echo "Processando Arquivo...\c"
tput blink; echo "Aguarde"

Para voltar a tela ao modo normal, use o comando tput reset.

tput bold - Coloca o cursor em modo negrito
Este comando permitir que os caracteres em tela sejam mostrados com maior destaque, isto , acentuando o
brilho dos caracteres exibidos. Por exemplo, para que a mensagem Aguarde fique com brilho mais intenso
ao lado da mensagem Processando Arquivo, use a seqncia de linha abaixo:

echo "Processando Arquivo...\c"
tput bold; echo "Aguarde"

Para voltar a tela ao modo normal, use o comando tput rmso.

tput smso - Ativa o modo vdeo reverso
Este comando permitir que a tela seja colocada em vdeo reverso, ou seja, caracteres negros em fundo
branco (fundo verde, dependendo da cor do terminal). Por exemplo, para que a mensagem Aguarde fique
em vdeo reverso ao lado da mensagem Processando Arquivo, use a seqncia de linha abaixo:

echo "Processando Arquivo...\c"
tput smso; echo "Aguarde"

Para voltar a tela ao modo normal, use o comando tput rmso.
Korn Shell Script Treinamento bsico em programao
87


tput rmso - Desativa o modo vdeo reverso
Este comando permite que a tela seja restaurada ao modo de caracteres normal. usado para desativar os
comandos tput bold e tput smso.Sua sintaxe resume-se a:

tput rmso

Para a desativao do comando tput blink use o comando tput reset.

tr -s " " - Remove o excesso de espaos
Este comando servir para que sejam removidos excesso de espaos, seja de uma string passada por pipeline
ou de um arquivo a ser tratado pelo comando. Suas sintaxes so:

echo String | tr -s " " - modo pipeline

tr -s " " < Arquivo - tratamento de arquivo

tr "[a-z]" "[A-Z]" - Converte caracteres em maisculas
Com este comando pode-se fazer converso de caracteres alfabticos de minsculas para maisculas e vice-
versa. Sintaxes:

echo String | tr "[a-z]" "[A-Z]" - modo pipeline convertendo para maisculas.

echo String | tr "[A-Z]" "[a-z]" - modo pipeline convertendo para minsculas.

tr "[a-z]" "[A-Z]" < Arquivo - tratamento de arquivo convertendo para maisculas.

tr "[A-Z]" "[a-z]" < Arquivo - tratamento de arquivo convertendo para minsculas.
Korn Shell Script Treinamento bsico em programao
88

S-ar putea să vă placă și