Curso de Shell Script 08/11

219 visualizações

Publicada em

Chegou a hora de fazer como Jack e dividir os programas em pedacinhos. Com funções e chamadas externas os scripts fi cam menores, a manutenção mais fácil e ainda por cima reaproveitamos código.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
219
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
7
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Curso de Shell Script 08/11

  1. 1. Linux User Papo de botequim Papo de Botequim Curso de Shell Script Parte VIII Dave Hamilton - www.sxc.hu Chegou a hora de fazer como Jack e dividir os programas em pedacinhos. Com funções e chamadas externas os scripts ficam menores, a manutenção mais fácil e ainda por cima reaproveitamos código. por Júlio Cezar Neves E aê, cara, tudo bem? posicionais ($1, $2, …, $n). Todas as regras que se aplicam – – Tudo beleza! Eu queria te mostrar o que fi z mas já sei que você vai querer molhar o bico primeiro, né? à passagem de parâmetros para programas também valem para funções, mas é muito importante realçar que os parâmetros – Só pra te contrariar, hoje não quero. Vai, mostra logo aí passados para um programa não se confundem com aqueles o que você fez. que são passados para suas funções. Isso significa, por exem- – Poxa, o exercício que você passou é muito grande. Dá uma plo, que o $1 de um script é diferente do $1 de uma de suas olhada na listagem 1 e vê como eu resolvi: funções internas. – É, o programa tá legal, tá todo estruturadinho, mas gosta- Repare que as variáveis $Msg, $TamMsg e $Col são de uso ria de fazer alguns poucos comentários: só para relembrar, restrito dessa rotina e, por isso, foram criadas como variáveis as seguintes construções: [ ! $Album ] && e [ $Musica ] locais. A razão é simplesmente a economia de memória, já que || representam a mesma coisa, isto é: no caso da primeira, ao sair da rotina elas serão devidamente detonadas, coisa que testamos se a variável $Album não (!) tem nada dentro, então não aconteceria se eu não tivesse usado esse artifício. (&&)… Na segunda, testamos se $Musica tem algum dado, A linha de código que cria a variável local Msg concatena ao senão (||)… texto recebido ($1) um parêntese, a resposta padrão ($2) em Se você reclamou do tamanho do programa, é porque ainda caixa alta, uma barra, a outra resposta ($3) em caixa baixa não te dei algumas dicas. Repare que a maior parte do script e fi naliza fechando o parêntese. Uso essa convenção para, ao é para mostrar mensagens centraliza- das na penúltima linha da tela. Repare Listagem 1: musinc5.sh ainda que algumas mensagens pedem 01 $ cat musinc5.sh um S ou um N como resposta e outras 02 #!/bin/bash são só de advertência. Isso é um caso 03 # Cadastra CDs (versao 5) típico que pede o uso de funções, que 04 # seriam escritas somente uma vez e 05 clear executadas em diversos pontos do 06 LinhaMesg=$((`tput lines` - 3)) # Linha onde serão mostradas as msgs para o operador script. Vou montar duas funções para 07 TotCols=$(tput cols) # Qtd colunas da tela para enquadrar msgs resolver esses casos e vamos incor- 08 echo “ porá-las ao seu programa para ver o Inclusão de Músicas resultado fi nal. ======== == ======= – Chico! Agora traz dois chopes, um Título do Álbum: sem colarinho, para me dar inspira- | Este campo foi ção. E você, de olho na listagem 2. Faixa: < criado somente para Como podemos ver, uma função é | orientar o preenchimento defi nida quando digitamos nome_da_ Nome da Música: função () e todo o seu corpo está Intérprete:” # Tela montada com um único echo entre chaves ({}). Já conversamos aqui 09 while true no boteco sobre passagem de parâ- 10 do metros e as funções os recebem da 11 tput cup 5 38; tput el # Posiciona e limpa linha ➟ mesma forma, isto é, são parâmetros86 maio 2005 edição 08 www.linuxmagazine.com.br
  2. 2. papo de botequim Linux User12 read Album mesmo tempo, mostrar as opções dis-13 [ ! “$Album” ] && # Operador deu <ENTER> poníveis e realçar a resposta oferecida14 { como padrão.15 Msg=”Deseja Terminar? (S/n)” Quase no fim da rotina, a resposta16 TamMsg=${#Msg} recebida ($SN) é convertida para caixa17 Col=$(((TotCols - TamMsg) / 2)) # Centraliza msg na linha baixa (minúsculas) de forma que no18 tput cup $LinhaMesg $Col corpo do programa não precisemos19 echo “$Msg” fazer esse teste. Veja na listagem 320 tput cup $LinhaMesg $((Col + TamMsg + 1)) como ficaria a função para exibir uma21 read -n1 SN mensagem na tela.22 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela Essa é uma outra forma de definir23 [ $SN = “N” -o $SN = “n” ] && continue # $SN é igual a N ou (-o) n? uma função: não a chamamos, como24 clear; exit # Fim da execução no exemplo anterior, usando uma25 } construção com a sintaxe nome_da_26 grep “^$Album^” musicas > /dev/null && função (), mas sim como function27 { nome_da_função. Em nada mais ela28 Msg=”Este álbum já está cadastrado” difere da anterior, exceto que, como29 TamMsg=${#Msg} consta dos comentários, usamos a30 Col=$(((TotCols - TamMsg) / 2)) # Centraliza msg na linha variável $* que, como já sabemos,31 tput cup $LinhaMesg $Col representa o conjunto de todos os32 echo “$Msg” parâmetros passados ao script, para33 read -n1 que o programador não precise usar34 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela aspas envolvendo a mensagem que35 continue # Volta para ler outro álbum deseja passar à função.36 } Para terminar com esse blá-blá-blá,37 Reg=”$Album^” # $Reg receberá os dados para gravação vamos ver na listagem 4 as alterações38 oArtista= # Variável que guarda artista anterior no programa quando usamos o con-39 while true ceito de funções:40 do Repare que a estrutura do script41 ((Faixa++)) segue a ordem Variáveis Globais, Fun-42 tput cup 7 38 ções e Corpo do Programa. Esta estrutu-43 echo $Faixa ração se deve ao fato de Shell Script ser44 tput cup 9 38 # Posiciona para ler música uma linguagem interpretada, em que45 read Musica o programa é lido da esquerda para46 [ “$Musica” ] || # Se o operador tiver dado <ENTER>... a direita e de cima para baixo. Para47 { ser vista pelo script e suas funções,48 Msg=”Fim de Álbum? (S/n)” uma variável deve ser declarada (ou49 TamMsg=${#Msg} inicializada, como preferem alguns)50 Col=$(((TotCols - TamMsg) / 2)) # Centraliza msg na linha antes de qualquer outra coisa. Por sua51 tput cup $LinhaMesg $Col vez, as funções devem ser declaradas52 echo “$Msg” antes do corpo do programa propria-53 tput cup $LinhaMesg $((Col + TamMsg + 1) mente dito. A explicação é simples: o54 read -n1 SN interpretador de comandos do shell55 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela deve saber do que se trata a função56 [ “$SN” = N -o “$SN” = n ] && continue # $SN é igual a N ou (-o) n? antes que ela seja chamada no pro-57 break # Sai do loop para gravar grama principal.58 } Uma coisa bacana na criação de fun-59 tput cup 11 38 # Posiciona para ler Artista ções é fazê-las tão genéricas quanto60 [ “$oArtista” ] && echo -n “($oArtista) “ # Artista anterior é default possível, de forma que possam ser61 read Artista reutilizadas em outros scripts e apli-62 [ “$Artista” ] && oArtista=”$Artista” cativos sem a necessidade de reinven-63 Reg=”$Reg$oArtista~$Musica:” # Montando registro tarmos a roda. As duas funções que64 tput cup 9 38; tput el # Apaga Música da tela acabamos de ver são bons exemplos,65 tput cup 11 38; tput el # Apaga Artista da tela pois é difícil um script de entrada de66 done dados que não use uma rotina como67 echo “$Reg” >> musicas # Grava registro no fim do arquivo a MandaMsg ou que não interaja com38 sort musicas -0 musicas # Classifica o arquivo o operador por meio de algo seme-69 done lhante à Pergunta. maio 2005 edição 08 87 www.linuxmagazine.com.br
  3. 3. Linux User Papo de botequim Conselho de amigo: crie um arquivo e anexe a ele cada fun- diretório /home. Só que assim que a execução do script termi- ção nova que você criar. Ao final de algum tempo você terá nou, o sub-shell foi para o beleléu e, com ele, todo o ambiente uma bela biblioteca de funções que lhe poupará muito tempo criado. Agora preste atenção no exemplo abaixo e veja como a de programação. coisa muda de figura: O comando source $ source script_bobo Veja se você nota algo de diferente na saída do ls a seguir: jneves juliana paula silvie $ pwd $ ls -la .bash_profile /home -rw-r--r-- 1 Julio unknown 4511 Mar 18 17:45 .bash_profile $ cd - /home/jneves Não olhe a resposta não, volte a prestar atenção! Bem, já que $ . script_bobo você está mesmo sem saco de pensar e prefere ler a resposta, jneves juliana paula silvie vou te dar uma dica: acho que você já sabe que o .bash_pro- $ pwd file é um dos scripts que são automaticamente executados /home quando você se “loga” (ARRGGHH! Odeio esse termo!) no sistema. Agora olhe nova- Listagem 2: Função Pergunta mente para a saída do comando ls e me 01 Pergunta () diga o que há de diferente nela. 02 { Como eu disse, o .bash_profile é exe- 03 # A função recebe 3 parâmetros na seguinte ordem: cutado durante o logon, mas repare que ele não tem nenhuma permissão de execução. 04 # $1 - Mensagem a ser mostrada na tela Isso acontece porque se você o executasse 05 # $2 - Valor a ser aceito com resposta padrão como qualquer outro script careta, no fim 06 # $3 - O outro valor aceito de sua execução todo o ambiente por ele 07 # Supondo que $1=Aceita?, $2=s e $3=n, a linha a gerado morreria junto com o shell sob o 08 # seguir colocaria em Msg o valor “Aceita? (S/n)” qual ele foi executado (você se lembra de 09 local Msg=”$1 (`echo $2 | tr a-z A-Z`/`echo $3 | tr A-Z a-z`)” que todos os scripts são executados em 10 local TamMsg=${#Msg} sub-shells, né?). Pois é para coisas assim 11 local Col=$(((TotCols - TamMsg) / 2)) # Centra msg na linha que existe o comando source, também 12 tput cup $LinhaMesg $Col conhecido por “.” (ponto). Este comando 13 echo “$Msg” faz com que o script que lhe for passado 14 tput cup $LinhaMesg $((Col + TamMsg + 1)) como parâmetro não seja executado em 15 read -n1 SN um sub-shell. Mas é melhor um exemplo 16 [ ! $SN ] && SN=$2 # Se vazia coloca default em SN que uma explicação em 453 palavras. Veja 17 echo $SN | tr A-Z a-z # A saída de SN será em minúscula o scriptzinho a seguir: 18 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela 19 return # Sai da função $ cat script_bobo 20 } cd .. ls Listagem 3: Função MandaMsg Ele simplesmente deveria ir para o dire- 01 function MandaMsg tório acima do diretório atual. Vamos 02 { executar uns comandos envolvendo o 03 # A função recebe somente um parâmetro script_bobo e analisar os resultados: 04 # com a mensagem que se deseja exibir. 05 # para não obrigar o programador a passar $ pwd 06 # a msg entre aspas, usaremos $* (todos /home/jneves 07 # os parâmetros, lembra?) e não $1. $ script_bobo 08 local Msg=”$*” jneves juliana paula silvie 09 local TamMsg=${#Msg} $ pwd 10 local Col=$(((TotCols - TamMsg) / 2)) # Centra msg na linha /home/jneves 11 tput cup $LinhaMesg $Col 12 echo “$Msg” Se eu mandei ele subir um diretório, 13 read -n1 por que não subiu? Opa, peraí que subiu 14 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela sim! O sub-shell que foi criado para exe- 15 return # Sai da função cutar o script tanto subiu que listou os 16 } diretórios dos quatro usuários abaixo do88 maio 2005 edição 08 www.linuxmagazine.com.br
  4. 4. papo de botequim Linux User Listagem 4: musinc6.sh 52 echo “ Inclusão de Músicas01 $ cat musinc6 ======== == =======02 #!/bin/bash Título do Álbum:03 # Cadastra CDs (versao 6) Faixa:04 # Nome da Música:05 # Área de variáveis globais Intérprete:”06 # Linha onde as mensagens serão exibidas 53 while true07 LinhaMesg=$((`tput lines` - 3)) 54 do08 # Quantidade de colunas na tela (para enquadrar as mensagens) 55 tput cup 5 38; tput el # Posiciona e limpa linha09 TotCols=$(tput cols) 56 read Album10 # Área de funções 57 [ ! “$Album” ] && # Operador deu <ENTER>11 Pergunta () 58 {12 { 59 Pergunta “Deseja Terminar” s n13 # A função recebe 3 parâmetros na seguinte ordem: 60 # Agora só testo caixa baixa14 # $1 - Mensagem a ser dada na tela 61 [ $SN = “n” ] && continue15 # $2 - Valor a ser aceito com resposta default 62 clear; exit # Fim da execução16 # $3 - O outro valor aceito 63 }17 # Supondo que $1=Aceita?, $2=s e $3=n, a linha 64 grep -iq “^$Album^” musicas 2> /dev/null &&18 # abaixo colocaria em Msg o valor “Aceita? (S/n)” 65 {19 local Msg=”$1 (`echo $2 | tr a-z A-Z`/`echo $3 | tr A-Z a-z`)” 66 MandaMsg Este álbum já está cadastrado20 local TamMsg=${#Msg} 67 continue # Volta para ler outro álbum21 # Centraliza a mensagem na linha 68 }22 local Col=$(((TotCols - TamMsg) / 2)) 69 Reg=”$Album^” # $Reg receberá os dados de gravação23 tput cup $LinhaMesg $Col 70 oArtista= # Guardará artista anterior24 echo “$Msg” 71 while true25 tput cup $LinhaMesg $((Col + TamMsg + 1)) 72 do26 read -n1 SN 73 ((Faixa++))27 [ ! $SN ] && SN=$2 # Se vazia, coloca default em SN 74 tput cup 7 3828 echo $SN | tr A-Z a-z # A saída de SN será em minúsculas 75 echo $Faixa29 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela 76 tput cup 9 38 # Posiciona para ler música30 return # Sai da função 77 read Musica31 } 78 [ “$Musica” ] || # Se o operador teclou <ENTER>...32 function MandaMsg 79 {33 { 80 Pergunta “Fim de Álbum?” s n34 # A função recebe somente um parâmetro 81 # Agora só testo a caixa baixa35 # com a mensagem que se deseja exibir; 82 [ “$SN” = n ] && continue36 # para não obrigar o programador a passar 83 break # Sai do loop para gravar dados37 # a msg entre aspas, usaremos $* (todos 84 }38 # os parâmetro, lembra?) e não $1. 85 tput cup 11 38 # Posiciona para ler Artista39 local Msg=”$*” 86 # O artista anterior é o padrão40 local TamMsg=${#Msg} 87 [ “$oArtista” ] && echo -n “($oArtista) “41 # Centraliza mensagem na linha 88 read Artista42 local Col=$(((TotCols - TamMsg) / 2)) 89 [ “$Artista” ] && oArtista=”$Artista”43 tput cup $LinhaMesg $Col 90 Reg=”$Reg$oArtista~$Musica:” # Montando registro44 echo “$Msg” 91 tput cup 9 38; tput el # Apaga Música da tela45 read -n1 92 tput cup 11 38; tput el # Apaga Artista da tela46 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela 93 done47 return # Sai da função 94 # Grava registro no fim do arquivo48 } 95 echo “$Reg” >> musicas49 # O corpo do programa propriamente dito começa aqui 96 # Classifica o arquivo50 clear 97 sort musicas -o musicas51 # A tela a seguir é montada com um único comando echo 98 done maio 2005 edição 08 89 www.linuxmagazine.com.br
  5. 5. Linux User Papo de botequim Listagem 5: musinc7.sh Ahh! Agora sim! Quando passado como parâmetro do comando source, 01 $ cat musinc7.sh o script foi executado no shell cor- 02 #!/bin/bash 03 # Cadastra CDs (versao 7) rente, deixando nele todo o ambiente 04 # criado. Agora vamos rebobinar a fita 05 # Área de variáveis globais até o início da explicação sobre este 06 LinhaMesg=$((`tput lines` - 3)) # Linha onde serão mostradas as msgs para o operador comando. Lá falamos do .bash_pro- 07 TotCols=$(tput cols) # Qtd colunas da tela para enquadrar msgs file e, a esta altura, você já deve saber 08 # O corpo do programa propriamente dito começa aqui que sua incumbência é, logo após o 09 clear login, preparar o ambiente de trabalho 10 echo “ para o usuário. Agora entendemos que Inclusão de Músicas é por isso mesmo que ele é executado ======== == ======= usando esse artifício. Título do Álbum: E agora você deve estar se per- | Este campo foi guntando se é só para isso que esse Faixa: < criado somente para comando serve. Eu lhe digo que sim, | orientar o preenchimento mas isso nos traz um monte de vanta- Nome da Música: gens – e uma das mais usadas é tratar Intérprete:” # Tela montada com um único echo funções como rotinas externas. Veja 11 while true na listagem 5 uma outra forma de fazer 12 do o nosso programa para incluir CDs no 13 tput cup 5 38; tput el # Posiciona e limpa linha 14 read Album arquivo musicas. 15 [ ! “$Album” ] && # Operador deu <ENTER> Agora o programa deu uma boa enco- 16 { lhida e as chamadas de função foram 17 source pergunta.func “Deseja Terminar” s n trocadas por arquivos externos chama- 18 [ $SN = “n” ] && continue # Agora só testo a caixa baixa dos pergunta.func e mandamsg.func, 19 clear; exit # Fim da execução que assim podem ser chamados por 20 } qualquer outro programa, dessa forma 21 grep -iq “^$Album^” musicas 2> /dev/null && reutilizando o seu código. 22 { Por motivos meramente didáticos, as 23 . mandamsg.func Este álbum já está cadastrado chamadas a pergunta.func e manda- 24 continue # Volta para ler outro álbum msg.func estão sendo feitas por source 25 } e por . (ponto) indiscriminadamente, 26 Reg=”$Album^” # $Reg receberá os dados de gravação embora eu prefira o source que, por 27 oArtista= # Guardará artista anterior ser mais visível, melhora a legibili- 28 while true dade do código e facilita sua posterior 29 do manutenção. Veja na listagem 6 como 30 ((Faixa++)) ficaram esses dois arquivos. 31 tput cup 7 38 Em ambos os arquivos, fiz somente 32 echo $Faixa 33 tput cup 9 38 # Posiciona para ler música duas mudanças, que veremos nas 34 read Musica observações a seguir. Porém, tenho 35 [ “$Musica” ] || # Se o operador tiver dado <ENTER>... mais três observações a fazer: 36 { 1. As variáveis não estão sendo mais 37 . pergunta.func “Fim de Álbum?” s n declaradas como locais, porque essa 38 [ “$SN” = n ] && continue # Agora só testo a caixa baixa é uma diretiva que só pode ser usada 39 break # Sai do loop para gravar dados no corpo de funções e, portanto, essas 40 } variáveis permanecem no ambiente do 41 tput cup 11 38 # Posiciona para ler Artista shell, poluindo-o; 42 [ “$oArtista” ] && echo -n “($oArtista) “ # Artista anterior é default 2. O comando return não está mais 43 read Artista presente, mas poderia estar sem alte- 44 [ “$Artista” ] && oArtista=”$Artista” rar em nada a lógica do script, uma 45 Reg=”$Reg$oArtista~$Musica:” # Montando registro vez que só serviria para indicar um 46 tput cup 9 38; tput el # Apaga Música da tela eventual erro por meio de um código 47 tput cup 11 38; tput el # Apaga Artista da tela de retorno previamente estabelecido 48 done (por exemplo return 1, return 2, …), 49 echo “$Reg” >> musicas # Grava registro no fim do arquivo sendo que o return e return 0 são 50 sort musicas -o musicas # Classifica o arquivo 51 done idênticos e significam que a rotina foi executada sem erros;90 maio 2005 edição 08 www.linuxmagazine.com.br
  6. 6. papo de botequim Linux User3. O comando que estamos acostumados Listagem 6: pergunta.func e mandamsg.func a usar para gerar um código de retorno 01 $ cat pergunta.func é o exit, mas a saída de uma rotina 02 # A função recebe 3 parâmetros na seguinte ordem: externa não pode ser feita dessa forma 03 # $1 - Mensagem a ser dada na tela porque, como ela está sendo executada 04 # $2 - Valor a ser aceito com resposta default no mesmo shell do script que o cha- 05 # $3 - O outro valor aceito mou, o exit simplesmente encerraria 06 # Supondo que $1=Aceita?, $2=s e $3=n, a linha esse shell, terminando a execução de 07 # abaixo colocaria em Msg o valor “Aceita? (S/n)” todo o script; 08 Msg=”$1 (`echo $2 | tr a-z A-Z`/`echo $3 | tr A-Z a-z`)”4. De onde veio a variável LinhaMesg? Ela 09 TamMsg=${#Msg} veio do script musinc7.sh, porque havia 10 Col=$(((TotCols - TamMsg) / 2)) # Centraliza msg na linha sido declarada antes da chamada das 11 tput cup $LinhaMesg $Col rotinas (nunca esqueça que o shell que 12 echo “$Msg” está interpretando o script e essas roti- 13 tput cup $LinhaMesg $((Col + TamMsg + 1)) nas é o mesmo); 14 read -n1 SN5. Se você decidir usar rotinas externas 15 [ ! $SN ] && SN=$2 # Se vazia coloca default em SN não se envergonhe, exagere nos comen- 16 echo $SN | tr A-Z a-z # A saída de SN será em minúscula tários, principalmente sobre a passagem 17 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela dos parâmetros, para facilitar a manu- 18 $ cat mandamsg.func tenção e o uso dessa rotina por outros 19 # A função recebe somente um parâmetro programas no futuro. 20 # com a mensagem que se deseja exibir; – Bem, agora você já tem mais um 21 # para não obrigar o programador a passar monte de novidades para melhorar 22 # a msg entre aspas, usaremos $* (todos os scripts que fizemos. Você se lem- 23 # os parâmetro, lembra?) e não $1. bra do programa listartista.sh no qual 24 Msg=”$*” você passava o nome de um artista 25 TamMsg=${#Msg} como parâmetro e ele devolvia as suas 26 Col=$(((TotCols - TamMsg) / 2)) # Centraliza msg na linha músicas? Ele era como o mostrado aqui 27 tput cup $LinhaMesg $Col embaixo na listagem 7. 28 echo “$Msg” – Claro que me lembro! 29 read -n1 – Para firmar os conceitos que te pas- 30 tput cup $LinhaMesg $Col; tput el # Apaga msg da tela sei, faça-o com a tela formatada e a execução em loop, de forma que ele só termine quando receber um Enter no lugar do nome Não se esqueça: em caso de dúvida ou falta de compa- do artista. Suponha que a tela tenha 25 linhas; a cada 22 nhia para um chope, é só mandar um e-mail para o endereço músicas listadas o programa deverá dar uma parada para julio.neves@gmail.com que terei prazer em lhe ajudar. Vou aproveitar que o operador possa lê-las. Eventuais mensagens de erro também para mandar minha propaganda: diga aos amigos que devem ser passadas usando a rotina mandamsg.func que quem estiver a fim de fazer um curso porreta de programação acabamos de desenvolver. Chico, manda mais dois!! O meu em Shell deve mandar um e-mail para julio.neves@tecnohall.com.br é com pouca pressão… para informar-se. Até mais! ■ Listagem 7: listartista.sh Informações 01 $ cat listartista.sh [1] Bash, página oficial: 02 #!/bin/bash http://www.gnu.org/software/bash/bash.html 03 # Dado um artista, mostra as suas musicas [2] Manual de referência do Bash: 04 # versao 2 http://www.gnu.org/software/bash/ 05 if [ $# -eq 0 ] manual/bashref.html 06 then 07 echo Voce deveria ter passado pelo menos um parametro 08 exit 1 Julio Cezar Neves é Analista de Suporte de Sobre o autor 09 fi Sistemas desde 1969 e trabalha com Unix 10 IFS=” 11 :” desde 1980, quando participou do desen- 12 for ArtMus in $(cut -f2 -d^ musicas) volvimento do SOX, um sistema operacio- 13 do nal similar ao Unix produzido pela Cobra 14 echo “$ArtMus” | grep -i “^$*~” > /dev/null && echo $ArtMus | cut -f2 -d~ Computadores. Pode ser contatado no 15 done e-mail julio.neves@gmail.com maio 2005 edição 08 91 www.linuxmagazine.com.br

×