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     | Agradecimentos
|
Links Amigos
				 | 
				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 for    for 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:  
No comando 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 for    for 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 for    for ((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.  | 
|||||||||||