Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Curso de Shell Script - 005, Notas de estudo de Informática

Você não agüenta mais aquele seu amigo usuário de Linux enchendo o seu saco com aquela história de que o sistema é fantástico e o Shell é uma ferramenta maravilhosa? A partir desta edição vai ficar mais fácil entender o porquê deste entusiasmo... POR JULIO CEZAR NEVES

Tipologia: Notas de estudo

2011

Compartilhado em 10/03/2011

william-felipe-dutra-abreu-da-silva
william-felipe-dutra-abreu-da-silva 🇧🇷

21 documentos

1 / 4

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
�����������������������������������������������������������������������������
����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
LI NU X US ER
Papo de Botequim
�������������������������������������������������������������������������
89edição 05
www.linuxmagazine.com.br
Fala cara! E as idéias estão em
ordem? Já fundiu a cuca ou você
ainda agüenta mais Shell?
Güento! gostando muito! Gostei
tanto que até caprichei no exercício
que você passou. Lembra que você
me pediu para fazer um progra ma
que recebe como parâmet ro o nome
de um arquivo e que quando execu-
tado salva esse arquivo com o nome
original seguido de um ti l (~) e o
abre dentro do vi?
Claro que lembro, me mostre e expli-
que como você fez.
Beleza, dá uma olhada no quadro 1
É, beleza! Mas me di z uma coisa: por
que você term inou o programa com
um exit 0?
Eu des cobr i que o mero após o
exit indica o código de retor no do
prog rama (o $?, lembra?) e assim,
como a execução foi bem sucedida,
ele encerra com o $?=0. Porém, se
você observar, ve que caso o pro-
grama não tenha recebido o nome do
arquivo ou caso o operador não tenha
permissão de gravação nesse arquivo,
o código de retorno ($?) seria dife-
rente do zero.
Grande garoto, aprendeu legal, mas é
bom deixar claro que exit 0, simples-
mente exit ou não colocar exit produ-
zem igualmente um código de retorno
($?) igual a zero. A gora vamos falar
sobre as instr uções de loop ou laço,
mas antes vou passar o conceito de
bloco de código.
Até agora já v imos alg uns blocos de
código, como quando te mostrei um
exemplo para fazer um cd para dentro
de um diretório:
cd lmb 2> /dev/null ||
{
mkdir lmb
cd lmb
}
O fragmento contido entre as duas
chaves ({}) forma um bloco de código.
Também nesse exercício que acabamos
de ver, em que salvamos o arquivo antes
de editá-lo, existe m vários blocos de
código compreendidos entre os coman-
dos then e do if. Um bloco de código
também pode esta r dentro de um case
ou entre um do e um done.
Peraí, Julio, que do e done são esses?
Não me lembro de você ter falado
nisso, e olha que estou prestando
muita atenção...
Pois é, ainda não ti nha falado porque
não havia chegado a hora certa.
Todas as inst ruções de loop ou laço
executam os comandos do bloco com-
preendidos entre um d o e um done. As
instruções de loop ou laço são for, while
e until , que serão explicada s uma a
uma a partir de hoje.
O comando For
Se você está habituado a progra mar,
certamente conhece o comando for,
mas o que você não sabe é que o for,
Blocos de código e laços (ou loops, como preferem alguns)
são o tema do mês em mais uma lição de nosso curso de Shell
Script. Garçom, salta uma boa redondinha, que tô a fi m de
refrescar o pensamento!
POR JULIO CEZAR NEVES
Curso de Shell Script
Papo de
Botequim V
$ cat vira.sh
#!/bin/bash
#
# vira - vi resguardando
# arquivo anterior
# Verifi ca se algum parâmetro foi
# passado
if [ “$#” -ne 1 ]
then
echo “Erro -> Uso: $0
U
<arquivo>”
exit 1
Arq=$1
# Caso o arquivo não exista, não
# há cópia a ser salva
if [ ! -f “$Arq” ]
then
vi $Arq
exit 0
# Se eu não puder alterar o
#arquivo, vou usar o vi para que?
if [ ! -w “$Arq” ]
then
echo “Você não tem permissão
U
de escrita em $Arq”
exit 2
# Já que está tudo OK, vou
# salvar a cópia e chamar o vi
cp -f $Arq $Arq~
vi $Arq
exit 0
Quadro 1: vira.sh
Dave Hamilton - www. sxc.hu
pf3
pf4

Pré-visualização parcial do texto

Baixe Curso de Shell Script - 005 e outras Notas de estudo em PDF para Informática, somente na Docsity!

Papo de Botequim LINUX USER

www.linuxmagazine.com.br edição 05 89

F

ala cara! E as idéias estão em ordem? Já fundiu a cuca ou você ainda agüenta mais Shell?

  • Güento! Tô gostando muito! Gostei

tanto que até caprichei no exercício que você passou. Lembra que você me pediu para fazer um programa que recebe como parâmetro o nome de um arquivo e que quando execu- tado salva esse arquivo com o nome original seguido de um til (~) e o abre dentro do vi?

  • Claro que lembro, me mostre e expli-

que como você fez.

  • Beleza, dá uma olhada no quadro 1
  • É, beleza! Mas me diz uma coisa: por

que você terminou o programa com um exit 0?

  • Eu descobri que o número após o

exit indica o código de retorno do programa (o $? , lembra?) e assim, como a execução foi bem sucedida, ele encerra com o $?=0. Porém, se você observar, verá que caso o pro- grama não tenha recebido o nome do arquivo ou caso o operador não tenha permissão de gravação nesse arquivo, o código de retorno ( $? ) seria dife- rente do zero.

  • Grande garoto, aprendeu legal, mas é

bom deixar claro que exit 0 , simples- mente exit ou não colocar exit produ- zem igualmente um código de retorno ( $? ) igual a zero. Agora vamos falar sobre as instruções de loop ou laço, mas antes vou passar o conceito de bloco de código. Até agora já vimos alguns blocos de código, como quando te mostrei um exemplo para fazer um cd para dentro de um diretório: cd lmb 2> /dev/null || { mkdir lmb cd lmb } O fragmento contido entre as duas chaves ( {} ) forma um bloco de código. Também nesse exercício que acabamos de ver, em que salvamos o arquivo antes de editá-lo, existem vários blocos de código compreendidos entre os coman- dos then e fi do if. Um bloco de código também pode estar dentro de um case ou entre um do e um done.

  • Peraí, Julio, que do e done são esses?

Não me lembro de você ter falado nisso, e olha que estou prestando muita atenção...

  • Pois é, ainda não tinha falado porque

não havia chegado a hora certa. Todas as instruções de loop ou laço executam os comandos do bloco com- preendidos entre um do e um done. As instruções de loop ou laço são for , while e until , que serão explicadas uma a uma a partir de hoje. O comando For Se você está habituado a programar, certamente já conhece o comando for , mas o que você não sabe é que o for , Blocos de código e laços (ou loops , como preferem alguns) são o tema do mês em mais uma lição de nosso curso de Shell Script. Garçom, salta uma boa redondinha, que tô a fim de refrescar o pensamento! POR JULIO CEZAR NEVES Curso de Shell Script

Papo de

Botequim V

$ cat vira.sh #!/bin/bash

vira - vi resguardando

arquivo anterior

Verifi ca se algum parâmetro foi

passado

if [ “$#” -ne 1 ] then echo “Erro -> Uso: $0 U ” exit 1 fi Arq=$

Caso o arquivo não exista, não

há cópia a ser salva

if [! -f “$Arq” ] then vi $Arq exit 0 fi

Se eu não puder alterar o

#arquivo, vou usar o vi para que? if [! -w “$Arq” ] then echo “Você não tem permissão U de escrita em $Arq” exit 2 fi

Já que está tudo OK, vou

salvar a cópia e chamar o vi

cp -f $Arq $Arq~ vi $Arq exit 0 Quadro 1: vira.sh Dave Hamilton - www.sxc.hu

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

��������������������������������������������������

��������������������������������������������������

90 edição 05 www.linuxmagazine.com.br LINUX USER^ Papo de Botequim que é uma instrução intrínseca do Shell (isso significa que o código fonte do comando faz parte do código fonte do Shell, ou seja, em bom programês é um built-in ), é muito mais poderoso que os seus correlatos das outras linguagens. Vamos entender a sua sintaxe, pri- meiro em português e, depois, como funciona pra valer. Olhe só: para var em val1 val2 ... valn faça cmd cmd cmdn feito Onde a variável var assume cada um dos valores da lista val1 val2 ... valn e, para cada um desses valores, executa o bloco de comandos formado por cmd1, cmd2 e cmdn. Agora que já vimos o significado da instrução em português, vejamos a sintaxe correta: for var in val1 val2 ... valn do cmd cmd cmdn done Vamos aos exemplos, para entender direito o funcionamento deste comando. Vamos escrever um script para listar todos os arquivos do diretório, separa- dos por dois-pontos, mas antes veja isso: $ echo * ArqDoDOS.txt1 confuso incusu logado musexc musicas musinc muslist Isto é, o Shell viu o asterisco (*), expandiu-o com o nome de todos os arquivos do diretório e o comando echo jogou-os para a tela separados por espa- ços em branco. Visto isso, vamos resol- ver o problema a que nos propusemos: $ cat testefor #!/bin/bash

1o. Programa didático para

entender o for

for Arq in * do echo -n $Arq: done Então vamos executá-lo: $ testefor ArqDoDOS.txt1:confuso:incusu: logado:musexc:musicas:musinc: muslist:$ Como você viu, o Shell transformou o asterisco (que odeia ser chamado de asterístico ) em uma lista de arqui- vos separados por espaços em branco. Quando o for viu aquela lista, disse: “Opa, listas separadas por espaços é comigo mesmo!” O bloco de comandos a ser executado era somente o echo , que com a opção -n listou a variável $Arq seguida de dois- pontos ( : ), sem saltar a linha. O cifrão ( $ ) do fi nal da linha da execução é o prompt, que permaneceu na mesma linha também em função da opção -n. Outro exemplo simples (por enquanto): $ cat testefor #!/bin/bash

2o. Programa didático para

entender o for

for Palavra in Linux Magazine U do Brasil do echo $Palavra done E executando temos: $ testefor Linux Magazine do Brasil Como você viu, esse exemplo é tão bobo e simples como o anterior, mas serve para mostrar o comporta- mento básico do for. Veja só a força do comando: ainda estamos na primeira possibilidade de sintaxe e já estou mos- trando novas formas de usá-lo. Lá atrás eu havia falado que o for usava listas separadas por espaços em branco, mas isso é uma meia-verdade, só para facili- tar a compreensão. Na verdade, as listas não são obrigatoriamente separadas por espaços. Mas antes de prosseguir, pre- ciso te mostrar como se comporta uma variável do sistema chamada de IFS, ou Inter Field Separator Veja no exemplo a seguir seu conteúdo: $ echo “$IFS” | od -h 0000000 0920 0a0a 0000004 Isto é, mandei a variável (protegida da interpretação do Shell pelas aspas) para um dump hexadecimal ( od -h ). O resultado pode ser interpretado com a tabela abaixo: O último 0a foi proveniente do dado ao fi nal do comando. Para melhorar a explicação, vamos ver isso de outra forma: $ echo “:$IFS:” | cat -vet : ^I$ :$ No comando cat , a opção -e repre- senta o como um cifrão ( $ ) e a opção -t representa o como um ^I. Usei os dois-pontos ( : ) para mos- trar o início e o fi m do echo. E dessa forma, pudemos notar que os três carac- teres estão presentes naquela variável. Agora veja você: traduzindo, IFS sig- nifica separador entre campos. Uma vez entendido isso, eu posso afi rmar que o comando for não usa apenas listas sepa- radas por espaços em branco, mas sim pelo conteúdo da variável $IFS , cujo valor padrão são os caracteres que aca- bamos de ver. Para comprovarmos isso, vamos continuar mexendo em nossa CDTeca, escrevendo um script que recebe o nome do artista como parâme- tro e lista as músicas que ele toca. Mas primeiramente vamos ver como está o nosso arquivo musicas: $ cat musicas album 1^Artista1~Musica1:U Artista2~Musica album 2^Artista3~Musica3:U Artista4~Musica album 3^Artista5~Musica5:U Artista6~Musica album 4^Artista7~Musica7:U Artista1~Musica Valor Hexadecimal Significado 09 20 0a Tabela 1: Resultado do od -h

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

��������������������������������������������������

��������������������������������������������������

92 edição 05 www.linuxmagazine.com.br LINUX USER^ Papo de Botequim Da mesma forma que os outros, come- çamos o exercício com uma crítica sobre os parâmetros recebidos, em seguida fizemos um for em que a variável $Musica receberá cada um dos parâme- tros passados, colocando em $Str todos os álbuns que contêm as músicas dese- jadas. Em seguida, o outro for pega cada bloco Artista~Musica nos registros que estão em $Str e lista cada artista que toca aquela música. Vamos executar o programa para ver se funciona mesmo: $ listamusica musica3 Musica4 U “Egüinha Pocotó” musica Artista Artista Musica Artista Egüinha Pocotó Não encontrada A listagem ficou feinha porque ainda não sabemos formatar a saída; mas qualquer dia desses, quando você sou- ber posicionar o cursor, trabalhar com cores etc., faremos esse programa nova- mente usando todas essas perfumarias. A esta altura dos acontecimentos, você deve estar se perguntando: “E aquele for tradicional das outras lingua- gens em que ele sai contando a partir de um número, com um determinado incremento, até alcançar uma condi- ção?”. E é aí que eu te respondo: “Eu não te disse que o nosso for é mais por- reta que o dos outros?” Para fazer isso, existem duas formas. Com a primeira sintaxe que vimos, como no exemplo: for i in $(seq 9) do echo -n “$i “ done 1 2 3 4 5 6 7 8 9 A variável i assumiu os valores intei- ros entre 1 a 9 gerados pelo comando seq e a opção -n do echo foi usada para não saltar uma linha a cada número lis- tado. Ainda usando o for com seq : for i in $(seq 4 9) do echo -n “$i “ done 4 5 6 7 8 9 Ou na forma mais completa do seq : for i in $(seq 0 3 9) do echo -n “$i “ done 0 3 6 9 A outra forma de fazer isso é com uma sintaxe muito semelhante ao for da linguagem C, como vemos a seguir: for ((var=ini; cond; incr)) do cmd cmd cmdn done Onde var=ini significa que a variá- vel var começará de um valor inicial ini ; cond significa que o loop ou laço for será executado enquanto var não atingir a condição cond e incr significa o incre- mento que a variável var sofrerá a cada passada do loop. Vamos aos exemplos: for ((i=1; i<=9; i++)) do echo -n “$i “ done 1 2 3 4 5 6 7 8 9 A variável i partiu do valor inicial 1, o bloco de código (aqui somente o echo ) será executado enquanto i for menor ou igual ( <= ) a 9 e o incremento de i será de 1 a cada passada do loop. Repare que no for propriamente dito (e não no bloco de código) não coloquei um cifrão ( $ ) antes do i e a notação para incrementar ( i++ ) é diferente do que vimos até agora. O uso de parênte- ses duplos (assim como o comando let ) chama o interpretador aritmético do Shell, que é mais tolerante. Só para mostrar como o let funciona e a versatilidade do for , vamos fazer a mesma coisa, mas omitindo a última parte do escopo do for , passando-a para o bloco de código: for ((; i<=9;)) do let i++ echo -n “$i “ done 1 2 3 4 5 6 7 8 9 Repare que o incremento saiu do corpo do for e passou para o bloco de código; repare também que, quando usei o let , não foi necessário iniciali- zar a variável $i. Veja só os comandos a seguir, digitados diretamente no prompt, para demonstrar o que acabo de falar: $ echo $j $ let j++ $ echo $j 1 Ou seja, a variável $j sequer existia e no primeiro let assumiu o valor 0 (zero) para, após o incremento, ter o valor 1. Veja só como as coisas ficam simples: for arq in * do let i++ echo “$i -> $Arq” done 1 -> ArqDoDOS.txt 2 -> confuso 3 -> incusu 4 -> listamusica 5 -> listartista 6 -> logado 7 -> musexc 8 -> musicas 9 -> musinc 10 -> muslist 11 -> testefor 12 -> testefor

  • Pois é amigo, tenho certeza que você

já tomou um xarope do comando for. Por hoje chega, na próxima vez em que nos encontrarmos falaremos sobre outras instruções de loop, mas eu gostaria que até lá você fi zesse um pequeno script para contar a quanti- dade de palavras de um arquivo texto, cujo nome seria recebido como parâ- metro. Essa contagem tem que ser feita com o comando for , para se habi- tuar ao seu uso. Não vale usar o wc -w. Aê Chico! Traz a saideira! ■ Julio Cezar Neves é Analista de Suporte de Sistemas desde 1969 e tra- balha com Unix desde 1980, quando participou do desenvolvimento do SOX, um sistema operacional similar ao Unix produzido pela Cobra Com- putadores. Pode ser contatado no SOBRE O AUTOR e-mail [email protected]