


Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 4
Esta página não é visível na pré-visualização
Não perca as partes importantes!



Papo de Botequim LINUX USER
www.linuxmagazine.com.br edição 05 89
ala cara! E as idéias estão em ordem? Já fundiu a cuca ou você ainda agüenta mais Shell?
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?
que como você fez.
que você terminou o programa com um exit 0?
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.
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.
Não me lembro de você ter falado nisso, e olha que estou prestando muita atenção...
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
Botequim V
$ cat vira.sh #!/bin/bash
if [ “$#” -ne 1 ] then echo “Erro -> Uso: $0 U ” exit 1 fi Arq=$
if [! -f “$Arq” ] then vi $Arq exit 0 fi
#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
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
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
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
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]