Programação Shell LinuxAqui temos um livro livre e completo sobre ShellOs sedentos do "saber livre" são muito benvindos. |
Comandos Shell Script |
![]() |
|
Home |
Artigos ![]() ![]() |
Comprar o livroChangelogs |
|
Papo de Botequim - Parte V- Fala cara! E as idéias estão em ordem? Já fundiu a cuca ou você ainda aguenta mais Shell? - Guento! Tô gostando muito! Gostei tanto que até caprichei no exercício que você passou. Lembra que você me pediu para fazer um programa que receberia como parâmetro o nome de um arquivo e que quando executado salvaria este arquivo com o nome original seguido de um til ( - Claro que lembro, me mostre e explique como você fez. $ cat vira
#!/bin/bash
#
# vira - vi resguardando arquivo anterior
# == = =
# Verificando se foi passado 1 parametro
if [ "$#" -ne 1 ]
then
echo "Erro -> Uso: $0 Arq=$1 # Caso o arquivo não exista, nao ha copia para ser salva if [ ! -f "$Arq" ] then vi $Arq exit 0 fi # Se nao puder alterar o arquivo vou usar o vi para que? if [ ! -w "$Arq" ] then echo "Voce nao tem direito de gravacao em $Arq" exit 2 fi # Ja que esta tudo OK, vou salvar a copia e chamar o vi cp -f $Arq $Arq~ vi $Arq exit 0 - É, beleza! Mas me diz uma coisa: porque você terminou o programa com um - Ahhh! Eu descobri que o número após o - Grande garoto, aprendeu legal, mas é bom deixar claro que
Até agora já vimos alguns blocos de programa. Quando te mostrei um exemplo para fazer um cd lmb 2> /dev/null || { mkdir lmb cd lmb }
O fragmento contido entre as duas chaves (
Um bloco de comandos também pode estar dentro de um - Peraí Julio, que - Pois é, ainda não havia falado porque não havia chegado o momento propício. Todas as instruções de loop ou laço, executam os comandos do bloco compreendido entre o Comandos de Loop (ou laço)
As instruções de loop ou laço são o O comando for
Se você está habituado a programar, certamente já conhece o comando Vamos entender a sua sintaxe, primeiramente em português e depois como funciona no duro. para var em val1 val2 ... valn faça cmd1 cmd2 cmdn feito
Onde a variável Agora que já vimos o significado da instrução em português, vejamos a sintaxe correta: Primeira sintaxe do comando forfor var in val1 val2 ... valn do cmd1 cmd2 cmdn done Vamos direto para os exemplos, para entender direito o funcionamento deste comando. Vamos escrever um script para listar todos os arquivos do nosso diretório separados por dois-pontos, mas primeiro veja: $ echo *
ArqDoDOS.txt1 confuso incusu logado musexc musicas musinc muslist
Isto é, o Shell viu o asterisco ( $ cat testefor1
#!/bin/bash
# 1o. Prog didático para entender o for
for Arq in * do echo -n $Arq: # A opcao -n eh para nao saltar linha done Então vamos executá-lo: $ testefor1
ArqDoDOS.txt1:confuso:incusu:logado:musexc:musicas:musinc:muslist:$
Como você viu o Shell transformou o asterísco (que odeia ser chamado de asterístico) em uma lista de arquivos separados por espaços em branco. quando o
O bloco de comandos a ser executado era somente o $ cat testefor2
#!/bin/bash
# 2o. Prog didático para entender o for
for Palavra in Papo de Botequim do echo $Palavra done E executando vem: $ testefor2
Papo
de
Botequim
Como você viu, este exemplo é tão bobo e simples como o anterior, mas serve para mostrar o comportamento básico do
Veja só a força do
No duro, as listas não são obrigatóriamente separadas por espaços mas antes de prosseguir, deixa eu te mostrar como se comporta uma variável do sistema chamada de $ 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 (
Onde o último $ echo ":$IFS:" | cat -vet
: ^I$
:$
Preste atenção na dica a seguir para entender a construção deste comando cat: ![]() cat , a opção -e representa o <ENTER> como um cifrão ($ ) e a opção -t representa o <TAB> como um ^I . Usei os dois-pontos (: ) para mostrar o início e o fim do echo . E desta forma, mais uma vez pudemos notar que os três caracteres estão presentes naquela variável.
Agora veja você, $ cat musicas
album 1^Artista1~Musica1:Artista2~Musica2
album 2^Artista3~Musica3:Artista4~Musica4
album 3^Artista5~Musica5:Artista6~Musica6
album 4^Artista7~Musica7:Artista1~Musica3
album 5^Artista9~Musica9:Artista10~Musica10
Em cima deste "leiaute" foi desenvolvido o script a seguir: $ cat listartista
#!/bin/bash
# Dado um artista, mostra as suas musicas
if [ $# -ne 1 ] then echo Voce deveria ter passado um parametro exit 1 fi IFS=" :" for ArtMus in $(cut -f2 -d^ musicas) do echo "$ArtMus" | grep $1 && echo $ArtMus | cut -f2 -d~ done
O script, como sempre, começa testando se os parâmetros foram passados corretamente, em seguida o $ listartista Artista1
Artista1~Musica1
Musica1
Artista1~Musica3
Musica3
Artista10~Musica10
Musica10
Êpa! Aconteceram duas coisas indesejáveis: os blocos também foram listados e a
Para que isso não ocorresse, eu deveia passar o nome do artista entre aspas ( echo "$ArtMus" | grep perereca & peteleca O que resultaria em erro. O correto seria: echo "$ArtMus" | grep -i "perereca & peteleca"
Onde foi colocado a opção
Ainda falta consertar o erro dele ter listado o $ cat listartista
#!/bin/bash
# Dado um artista, mostra as suas musicas
# versao 2
if [ $# -eq 0 ] then echo Voce deveria ter passado pelo menos um parametro exit 1 fi IFS=" :" for ArtMus in $(cut -f2 -d^ musicas) do echo "$ArtMus" | grep -i "^$@~" > /dev/null && echo $ArtMus | cut -f2 -d~ done Que executando vem: $ listartista Artista1
Musica1
Musica3
Segunda sintaxe do comando forfor var do cmd1 cmd2 cmdn done - Ué, sem o - Pois é, né? Esta construção a primeira vista parece xquisita mas é bastante simples. Neste caso, Vamos logo aos exemplos para entender melhor. Vamos fazer um script que receba como parâmetro um monte de músicas e liste seus autores: $ cat listamusica
#!/bin/bash
# Recebe parte dos nomes de musicas como parametro e
# lista os interpretes. Se o nome for composto, deve
# ser passado entre aspas.
# ex. "Eu nao sou cachorro nao" "Churrasquinho de Mae"
#
if [ $# -eq 0 ]
then
echo Uso: $0 musica1 [musica2] ... [musican]
exit 1
fi
IFS="
:"
for Musica
do
echo $Musica
Str=$(grep -i "$Musica" musicas) ||
{
echo " Não encontrada"
continue
}
for ArtMus in $(echo "$Str" | cut -f2 -d^)
do
echo " $ArtMus" | grep -i "$Musica" | cut -f1 -d~
done
done
Da mesma forma que os outros, começamos o exercício com uma crítica sobre os parâmetros recebidos, em seguida fizemos um Como sempre vamos executá-lo para ver se funciona mesmo: $ listamusica musica3 Musica4 "Eguinha Pocotó"
musica3
Artista3
Artista1
Musica4
Artista4
Eguinha Pocotó
Não encontrada
A listagem ficou feinha porque ainda não sabemos formatar a saída, mas qualquer dia desses, quando você souber posicionar o cursor, fazer negrito, trabalhar com cores e etc, faremos esta listagem novamente usando todas estas perfumarias e ela ficará muito fashion.
A esta altura dos acontecimentos você deve estar se perguntando: "E aquele
E é aí que eu te respondo: "Eu não te disse que o nosso 1 - Com a primeira sintaxe que vimos, como nos exemplos a seguir direto no prompt: $ for i in $(seq 9)
> do
> echo -n "$i "
> done
1 2 3 4 5 6 7 8 9
Neste a variável $ for i in $(seq 3 9)
> do
> echo -n "$i "
> done
4 5 6 7 8 9
Ou ainda na forma mais completa do
$ for i in $(seq 0 3 9)
> do
> echo -n "$i "
> done
0 3 6 9
2 – A outra forma de fazer o desejado é com uma sintaxe muito semelhante ao
Terceira sintaxe do comando forfor ((var=ini; cond; incr)) do cmd1 cmd2 cmdn done Onde:
Como sempre vamos aos exemplos que a coisa fica mais fácil: $ for ((i=1; i<=9; i++))
> do
> echo -n "$i "
> done
1 2 3 4 5 6 7 8 9
Neste caso a variável
Repare que no
Como me referi ao comando $ 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 $ echo $j
$ let j++ $ echo $j 1
Ou seja, a variável Veja só como as coisas ficam simples: $ for arq in *
> do
> let i++
> echo "$i -> $Arq"
> done
1 -> ArqDoDOS.txt1
2 -> confuso
3 -> incusu
4 -> listamusica
5 -> listartista
6 -> logado
7 -> musexc
8 -> musicas
9 -> musinc
10 -> muslist
11 -> testefor1
12 -> testefor2
- Pois é amigo, tenho certeza que você já tomou um xarope do comando
OBS: Essa contagem tem de ser feita usando o comando for para se habituar ao seu uso. Não vale usar o - Aê Chico! Traz a saideira. Vou aproveitar também para mandar o meu jabá: diga para os amigos que quem estiver afim de fazer um curso porreta de programação em Shell que mande um e-mail para a nossa gerencia de treinamento para informar-se. Qualquer dúvida ou falta de companhia para um chope ou até para falar mal dos políticos é só mandar um e-mail para mim. Valeu! |
||||||||||
Licença Creative Commons - Atribuição e Não Comercial (CC) 2009 Pelos Frequentadores do Bar do Júlio Neves. Todo o conteúdo desta página pode ser utilizado segundo os termos da Creative Commons License: Atribuição-UsoNãoComercial-PermanênciaDaLicença. |