You are on page 1of 45

1

Um passeio pelo Shell Script


Por: Rudson R. Alves Bacharel em Fsica - UFES Mestre em Fsica - UNICAMP Usurio de UNIX deste 1991 Slackware GNU/Linux deste 1994 Fundador de Grupo Guar - 2003 Fundador do GUSES: http://www.guses.com.br Colaborador do projeto Slack.Sarava: mkbuild, createpkg, ... http://slack.sarava.org/

Apresentao

Shell Script Echo Variveis Estruturas do Bash (testes) Passando Parmetros Funo Redirecionamento Algumas ferramentas do Shell

Vrios Shells
O Shell um interpretador de comandos. Mais que uma camada entre o sistema operacional e o usurio, ele tambm uma poderosa linguagem de programao.

Bsh Bouner Shell (Steve Bourne 7 verso do UNIX Bell Labs) Ksh - Korn Shell (David G. Korn at AT&T Bell Labs) Csh C like shell Bash - GNU Bourne-Again SHell

Shell Script
Um programa em shell, geralmente chamado de Script, ou Script Shell

Shell Script = seqncia de chamadas a programas, binrios compilados e todo o repertrio de comandos do UNIX + estruturas de programao do shell (Ifs, WHILEs, FORs, testes, ...
...Como o Shell poderoso, com o tempo mais e mais tarefas comeam a ser desempenhadas por Scripts e estes comeam a crescer, ficar lentos, complicados, difceis de manter. ... normal tambm escrever Scripts rpidos, de poucas linhas, que usado por alguns dias e depois simplesmente esquecido... (Aurlio Marinho Jargas)

Shell Script
Recomendaes para a construo de bons Scripts

Cabealho inicial com detalhes sobre o funcionamento Cdigo alinhado (indent) e bem espaado verticalmente Comentrios explicativos e esclarecedores Nomes descritivos de Funes e Variveis Controle de alteraes e Verses Estrutura interna coesa e padronizada

Shell Script
O primeiro Script
01 02 03 04 05 06 07 #!/bin/sh # # Script para limpar a tela echo A tela ser apagada em 10s sleep 10 clear

#!/bin/sh - Shell a executar o script (bash, zsh, ash, perl, ...) # - comentrio

Shell Script
Executando o Script
$ sh ./meu_script $ . ./meu_script $ source meu_script $ chmod +x meu_script $ ./meu_script ou $ meu_script Se o diretrio corrente (.) estiver no PATH

Imprimindo
Comando echo
Sintaxe: echo [opes] [string] Imprime uma string na sada padro Algumas opes: -n imprime sem alimentao de linha -e habilita interpretao de texto \a - beep \n - nova linha \c - no alimenta linha \t - tabelamento horizontal \0NNN - caracter de cdigo ASCII NNN (octal) ...

Imprimindo
Exemplos com echo
$ echo Linux Linux Entra com um nome e o imprime #!/bin/bash # Recebe um nome e imprime # clear echo -n Entre com seu nome: read NOME echo Seu nome $NOME

$ echo -e \nLinux Linux

$ echo -e \033[31m Linux \033[0m Linux

10

Imprimindo
Aurlio + echo
#!/bin/sh # cores.sh - Mostra todas as combinaes de cores do console # 2003-07-23 Aurelio Marinho Jargas for LETRA in $(seq 0 7); do # LINHAS: cores das letras for BRILHO in '' ';1'; do # liga/desliga cor brilhante for FUNDO in $(seq 0 7); do # COLUNAS: cores dos fundos SEQ="4$FUNDO;3$LETRA" # compe cdigo de cores echo -e "\033[$SEQ${BRILHO}m\c" # liga a cor echo -e " $SEQ${BRILHO:- } \c" # mostra o cdigo na tela echo -e "\033[m\c" # desliga a cor done; echo # quebra a linha done done

11

Variveis
Manipulando Strings
${var:-texto} ${#var} ${!var} ${var:N} ${var:N:tam} ${var#texto} ${var%texto} ${var/texto/novo} ${var//texto/novo} Se var no est definida, retorna 'texto' Retorna o tamanho da string Executa o contedo de $var (igual a: eval $var) Retorna o texto partir da posio 'N' Retorna 'tam' caracteres partir da posio 'N' Corta 'texto' do incio da string Corta 'texto' do final da string Substitui 'texto' por 'novo', uma vez Substitui 'texto' por 'novo', sempre

12

Variveis
Exemplos
$ VAR=E assim, quando mais tarde me procure, quem sabe a morte, angstia de quem vive... $ echo Esta frase possui ${#VAR} caracteres Esta frase possui 82 caracteres $ echo ${VAR//quem/QUEM} E assim, quando mais tarde me procure, QUEM sabe a morte, angstia de QUEM vive... $ echo ${VAR#E assim, quando mais tarde me procure, } quem sabe a morte, angstia de quem vive... $ echo ${VAR%, quem sabe a morte, angstia de quem vive...} E assim, quando mais tarde me procure $ echo ${VAR:2:5} assim

13

Variveis
Operaes Matemticas
$ A=5; B=3 $ echo $A + $B = $((A+B)) 5 + #!/bin/sh 3 = 8

# Script para calcular a idade $ echo $(($A%$B)) # 2 echo -n Entre com o seu ano de nascimento: read RESP $ let A++; ((B++)); C=$((A+B)); echo A=$A , B=$B e C=$C IDADE=$(($(date +%Y)-$RESP)) A=6 echo Sua idade de $IDADE anos , B=4 e C=10
$ echo A*B=$((A*B)) A*B=24 A^B=1296 A^B=$((A**B))

14

Estruturas do Bash
Sintaxe do comando if
if CONDIO; then comandos elif CONDIO; then comandos else comandos fi

15

Como testar?
Testes

-lt -gt -le -ge -eq -ne Expresses numricas menor que (Less Than) maior que (Greater Than) igual ou menor (Less Equal) maior ou igual (Greater Equal) igual (EQual) diferente (Not Equal)

Condicionais ! NO lgico (NOT) -a E lgico (AND) -o OU lgico (OR)

Strings = != -ne -z igual diferente no nula nula

Exemplos [ 5 -lt 3 ] 5 menor que 3? [ ! 5 -lt 3 ] 5 no menor que 3? [ a = b ] a igual a b? [ -z $VALOR ] $VALOR est vazia?

16

Como testar?
Mais testes
Testes de arquivo/diretrio -d um diretrio -e o arquivo existe -f um arquivo normal -G o grupo do arquivo o do usurio atual -L o arquivo/diretrio um link simblico -O o dono do arquivo o usurio atual -p o arquivo um named pipe -r o arquivo/diretrio tem permisso de leitura -s o tamanho do arquivo maior que zero -N o arquivo foi modificado desde a ltima leitura -w o arquivo/diretrio tem permisso de escrita -x o arquivo/diretrio tem permisso de execuo -nt o arquivo mais recente (Newer Than) -ot o arquivo mais antigo (Older Than) -ef o arquivo o mesmo (Equal File)

17

Estruturas do Bash
if na inicializao do sistema
#!/bin/sh # # rc.M This file is executed by init(8) when the system is being ... # Tell the viewers what's going to happen. echo "Going multiuser..." ... # Start networking daemons: if [ -x /etc/rc.d/rc.inet2 ]; then . /etc/rc.d/rc.inet2 fi ... # Start the print spooling system. This will usually be LPRng (lpd) or CUPS. if [ -x /etc/rc.d/rc.cups ]; then # Start CUPS: /etc/rc.d/rc.cups start elif [ -x /etc/rc.d/rc.lprng ]; then # Start LPRng (lpd): . /etc/rc.d/rc.lprng start fi ...

18

Estruturas do Bash
Script para resolver equao de 2 grau

#!/bin/bash # Equao de segundo grau # Por Rudson R. Alves # Verso 1.1 if [ -z $3 ]; then echo -e "Entre: segrau <A> <B> <C>\npara: AX^2 + BX + C = 0" exit fi echo "$1 X^2 + $2 X + $3 = 0" DELTA=$( echo "scale=10; $2^2 - 4*$1*$3" | bc -l ) if [ "$DELTA" -lt "0" ]; then echo "No possui raizes reais" else echo "Raizes reais:" SQRT=$( echo "scale=10; sqrt($DELTA )" | bc -l ) X1=$( echo "scale=10; (((-1)*$2) + $SQRT)/(2*$1)" | bc -l ) X2=$( echo "scale=10; (((-1)*$2) - $SQRT)/(2*$1)" | bc -l ) echo -e "R1 = $X1\nR2 = $X2" fi

19

Estruturas do Bash
Um pouco de diverso
$ echo abacaxi > t1 $ echo abobora > t2 $ mkdir t3 $ ln -s t1 t4 $ chmod 770 t1 $ ls -l total 8 -rw-r--r-- 1 rudson users 8 2006-04-22 -rw-r--r-- 1 rudson users 8 2006-04-22 drwxr-xr-x 2 rudson users 72 2006-04-22 lrwxrwxrwx 1 rudson users 2 2006-04-22

12:17 12:17 12:17 12:17

t1 t2 t3/ t4 -> t1

20

Estruturas do Bash
Identificando um arquivo com o if
#!/bin/bash # Script para identificar o arquivo passado como diretrio, arquivo, # link, ... # if [ -z $1 ]; then echo Voc deve entrar com um arquivo echo $0 [arquivo/diretrio/...] exit fi if [ ! -e $1 echo $1 elif [ -L $1 echo $1 elif [ -f $1 echo $1 elif [ -d $1 echo $1 else echo $1 fi ]; then no existe ]; then um link ]; then um arquivo ]; then um diretrio no identificado

21

Estruturas do Bash
Outra forma de testar
[ TESTE ] && CONDIO VERDADEIRA || CONDIO FALSA
[ -x t1 ] && echo t1 executvel || echo t1 no executvel

[ -f t1 ] && echo t1 um arquivo || echo t1 no um arquivo

[ -d t1 ] && echo t1 um diretrio || echo t1 no um diretrio

[ t1 -nt t1 ] && echo t1 mais novo que t2 || echo t1 mais velho que t2

22

Estruturas do Bash
Sintaxe do comando for

for VAR in LISTA; do comandos done

23

Estruturas do Bash
Comando for
$ for FILE in *; do mv $FILE $FILE.dsk; done $ for FILE in *.wav; do play $FILE; done $ LISTA=1 banana carlos 4 0011 $ for N in $LISTA; do echo >$N<; done >1< >banana< >carlos< >4< >0011< $ for i in $(seq 1 10); do echo $i; done $ for ((i=1;i<11;i++)); do echo $i; done $ for FIG in *.jpg; do convert $FIG ${FIG/.jpg/.png}; done

24

Estruturas do Bash
Exemplo com o for
#!/bin/bash # gauge.sh - barra de progresso usando caracteres de controle # 2003/07/23 Aurelio Marinho Jargas # # [...................................................] 0% # [========================...........................] 50% # [===================================================] 100% # # barra vazia echo -n "[>..................................................] 0%" passo="=>" for i in $(seq 1 100); do sleep .1 pos=$((i/2+1)) # calcula a posio atual da barra echo -ne "\033[G" # vai para o comeo da linha echo -ne "\033[${pos}C" # vai para a posio atual da barra echo -n "$passo" # preenche mais um passo echo -ne "\033[55G" # vai para a posio da porcentagem v=" $i" echo -n "${v:${#v}-3}" # mostra a porcentagem echo -ne "\033[53G]" done echo

25

Estruturas do Bash
Sintaxe do comando while

while CONDIO; do comandos done

26

Estruturas do Bash
Comando while
$ while [ $ANS != y ]; do read ANS; done

$ while read LINE; do echo $LINE; done < /etc/fstab

$ more /etc/fstab | while read LINE; do echo -->$LINE; done

27

Estruturas do Bash
Sintaxe do comando case
case $VAR in caso1) comandos ;; caso2) comandos ;; ... esac

28

Estruturas do Bash
Comando case Script de inicializao do servio ssh (/etc/rc.d/rc.sshd)
#!/bin/sh $ read ANS; case $ANS in 1) echo > 1;; 2) echo Start/stop/restart > 3,4 shell server: > #2;; 3|4|5) echothe secureou 5;; *) echo > outra coisa;; esac ... $ read ANS;\ case "$1" in case $ANS in\ 'start') 1)\ sshd_start echo > 1\ ;; ;;\ 'stop') 2)\ sshd_stop echo > 2\ ;; ;;\ 'restart') 3|4|5)\ sshd_restart echo > 3,4 ou 5\ ;; ;;\ *) *)\ echo "usage $0 start|stop|restart" echo > outra coisa\ esac ;; esac

29

Passando Parmetros
Passando parmetros
$0 $1 ... $9 $10 ... $# $* $@ $$ $? Parmetro nmero 0 (nome do comando ou funo) Parmetro nmero 1 Parmetro nmero 9 Parmetro nmero 10 Nmero de parmetros Todos os parmetros numa nica string Todos os parmetros em strings separadas Nmero PID do processo Cdigo de retorno do ltimo comando

30

Passando Parmetros
Script parametros.sh
#!/bin/sh # # Apresenta os parmetros enviados ao script, # enumerando-os, um por linha. # # Entrada: Parmetros quaisquer # echo "Nmero de parmetros passados $#" j=1 for i in $*; do echo "Parmetro $j: $i" let j++ done

31

Funo
Sintaxe de funo
function nome_da_funo() { comandos }

nome_da_funo() { comandos }

32

Funo
Funes: funcao.sh
#!/bin/bash # # Script para teste de funes # function func() { echo "Nmero de parmetros passados $#" j=1 for i in $*; do echo "Parmetro $j: $i" let j++ done } #-----------------------------------------echo "Teste de funes" LISTA=$* func $LISTA

33

Redirecionamento
Redirecionamentos
> < >> 2> 2>> 2>&1 >&2 >&2>&| redireciona a sada padro (STDOUT) redireciona a entrada padro (STDIN) redireciona a sada padro (anexando) redireciona a sada de erro (STDERR) redireciona a sada de erro (anexando) conecta a sada de erro a sada padro conecta a sada padro a sada de erro fecha a sada padro fecha a sada de erro conecta a sada padro com a endrada padro do comando seguinte

34

Redirecionamento
Exemplos de redirecionamento
$ ls -la > LISTA.TXT $ startx 2> ERROS-XORG

$ ls -la /dev/ | grep ^b

$ echo -e '\n echo Iniciando o automount... \n /etc/rc.d/rc.autofs start \n' >> /etc/rc.d/rc.local

35

Cat
Comando cat
Sintaxe: cat [opes] [arquivo] Apresenta o contedo de um arquivo. Algumas opes: -n, --number -s, --squeeze-blank -E, --show-ends Exemplos: $ cat /etc/fstab ... $ cat -n /etc/fstab 1 ... enumera as linhas remove linhas em branco coloca um $ no fim de cada linha

36

Cut
Comando cut
Sintaxe: cut [opes] [arquivo] Extrai sees especficas de uma linha. Algumas opes: -d, --delimiter=DELIM -f, --fields=LIST -c, --characters=LIST

utiliza um delimitador especfico, ao invs do TAB seleciona apenas os campos especificados seleciona apenas estes caracteres

Exemplos: $ echo 01:02:03:04:05:06:07:08:09 | cut -c 5-8 2:03 $ echo 01:02:03:04:05:06:07:08:09 | cut -d: -f3 03 $echo 01:02:03:04:05:06:07:08:09 | cut -d: -f3,6-8 03:06:07:08

37

Grep
Comando grep
Sintaxe: grep [opes] FILTRO [arquivo] Filtra linhas em um arquivo que possuem um dado padro (FILTRO). Algumas opes: -i, --ignore-case ignora distino de letras maisculas/minsculas -v, --invert-matchseleciona linhas que no possuem o FILTRO -r, --recursive busca recursivamente em todos os diretrios e sub-dir -n, --line-number coloca nmero de linha -s, --no-messages omite mensagens de erro -l, --files-with-matches apresenta apenas o nome do arquivo que possui o FILTRO

38

Grep
Comando grep
$ grep wireless /usr/doc/Linux-HOWTOs/ ... Apresenta as linhas dos arquivos que possuem a palavra 'wireless' $ grep -r -l -s wireless /usr/doc/Linux-HOWTOs/ ... Apresenta o nome dos arquivos (-l) que possuem a palavra 'wireless', contidos no diretrio e sub-diretrios (-r) /var/log/ e omiti mensagens de erro (-s)

39

Sort
Comando sort
Sintaxe: sort [opes] [arquivo] Ordena as linhas de um arquivo. Algumas opes: -f, --ignore-case -r, --reverse ignora maisculas/minsculas ordem reversa

Exemplos: $ sort /etc/passwd ... $ sort -r /etc/passwd

40

Find
Comando find
Sintaxe: find [-L] [-P] [caminho] [expresso] Busca de arquivos Opes: -P nunca segue links simblicos -L sempre segue links simblicos Expresses: -name <nome> -iname <nome> -type <tipo> especifica nome ou parte dele ignora diferenas entre letras maisculas/minsculas especifica o tipo do arquivo (d - diretrio, f - arquivo, l - link ) -user <usurio> arquivos pretencentes ao <usurio> -exec <comando> executa um comando com os arquivos encontrados -size <tam> arquivos com o tamanho <tam>

41

Find
Exemplos: $ find /usr/lib -name libcairo* ... $ find . -type d -exec du -sh {} + ... apresenta o tamanho de cada subdiretrio em ., atravs do comando du

Outros comandos
users, wc, tr, date, head, tail, xargs, ...

42

Sed
Comando sed
Sintaxe: sed 'comandos' [arquivo] O comando sed um editor de linha
Criar um arquivo test.txt com 20 linhas com um nmero aleatrio em cada linha: $ for i in $(seq 1 20); do SENHA=$RANDOM; echo $i $SENHA >> test.txt; done Remover a 5 linha: $ sed '5 d' test.txt Remover a linha contendo 7 : $ sed '/7 / d' test.txt Substituir a primeira ocorrncias de 2 por -DOIS-: $ sed 's/2/-DOIS-/' test.txt Substituir todas as ocorrncias de 2 por -DOIS-: $ sed 's/2/-DOIS-/g' test.txt

Remover todas as linhas que possua os nmeros 6 e 5: $ sed '/6/ d; /5/ d' test.txt

43

Awk
Sintaxe: awk [ opes ] ... Uma linguagem de propsitos gerais, designada para processar dados em formato texto
Apresenta o grupo e o nome do dispositivo em /dev/ ls -l /dev | awk '{ print $4 \t $9 }'

Comando awk

Soma os tamanhos em bytes dos arquivos (coluna 5 do ls -l) ls -l /dev/ | awk '{ sum += $5 } END { print sum }'

Somas os tamanhos em bytes dos arquivos pertencentes ao grupo disk ls -l /dev/ | awk '$4 == disk { sum += $5 } END { print sum }'

44

Consideraes finais
#!/bin/bash # # cd2mp3.sh - Converso de um CD de audio ou arquivos avi em mp3 # # Homepage : http://www.guses.com.br # Autor : Rudson R. Alves <alves[a]guses.com.br> # Mantenedor: Rudson R. Alves <alves[a]guses.com.br> # # --------------------------------------------------------------# IMPLEMENTAR # # --------------------------------------------------------------# Este programa converter um cd de audio em mp3, com a possibilidade # de seleo de trilhas especficas. Os parmetros passados ao lame # e cdda2wav so declarados nas variveis LAMEOPTS e CDDAOPTS, # respectivamente # A compresso mp3 feita com o padro vbr (variable bitrate) em # alta qualidade (-V 0) # # Exemplos: # 1 - Converte todo um CD de audio em mp3 # $ cd2mp3 raul # # 2 - Converte as trilhas 4,5,8 a 15 em mp3 # $ cd2mp3 -t 4,5,8-15 # # 3 - Converte da trilha 1 a 10 em mp3 # $ cd2mp3 -t 1-10 # $ cd2mp3 -t -10 # # 4 - Converte da trilha 13 at a ltima # $ cd2mp3 -t 13# # 5 - Converte todos os arquivos *.wav para *.mp3 # $ cd2mp3 -mp3only # # # Histrico # v 1.4.11 23-04-2006 # - Corrigido bug na varivel MUSICFILE. Ele deve iniciar com # algum valor diferente de nulo. # - Teste [ ! -x $MUSICFILE ] foi mudado para [ ! -s $MUSICFILE ], # que verifica se o tamanho do arquivo diferente de zero # v 1.3 28/02/2006 # - Ler arquivo de configurao em ~/.local/etc/ se houver # v 1.2 06/01/2006 # - Checagem dos aplicativos cdda2wav e lame # - Criao de um pacote e estruturao com arquivo de # configurao # - Adio de mais comentrios no programa # v 1.1 05/01/2006 # - adio das opes de inicializao # -t ... start track # -mp3only converte os arquivos wave para mp3 # --help, -h help # v 1.0 # - primeira verso # # COPYRIGHT: Este programa GPL. # #---------------------------------------------------------------# Funoes #---------------------------------------------------------------# Funo para gerar uma lista de nmeros a partir de uma entrada # na forma 1,4,8,10-15 => 1 4 8 10 11 12 13 14 15 # Uso: # cd2mp3_mklist <lista> <ltimo nmero da lista> # Parmetros de entrada: # 1 - lista como a do exemplo acima # 2 - ltimo nmero da seqencia, para processar opes como 4- (4 5 6 ... ltimo) # e all (1 2 3 ... ltimo) function cd2mp3_mklist() { # ltimo nmero possvel para a lista LAST_NUMBER=$2 # Seqncia para composio da lista AUX=${1//,/ } # substitui vrgulas por espaos ANSWER=${AUX//-/ - } # substitui hifens por espao hifem espao # Inicia lista NLIST="" # verifica se para gerar uma lista completa if [ "$ANSWER" = "all" -o "$ANSWER" = "ALL" ]; then NLIST=$( seq 1 $LAST_NUMBER ) # gera lista completa (1 2 3 ... LAST_NUMBER) else # gera lista personalizada NEXT="" # prximo algarismo da lista SEQ="" # flag de seqncia for i in $ANSWER; do # verifica se gera uma seqncia if [ "$i" = "-" ]; then if [ "$i" = "-" ]; then SEQ="+" else # checa maior itm da lista if [ "$i" -gt "$LAST_NUMBER" ]; then N="$LAST_NUMBER" else N="$i" fi # if [ "$SEQ" = "+" ]; then # checa maior itm da lista if [ "$N" -gt "$LAST_NUMBER" ]; then END="$LAST_NUMBER" else END="$N" fi # gera uma seqncia if [ "$NEXT" = "" ]; then NLIST="$NLIST $( seq 1 $N )" else NLIST="$NLIST $( seq $NEXT $N )" fi SEQ="" NEXT="" else # se NEXT estiver carregado, descarregue-o na lista if [ "$NEXT" != "" ]; then NLIST="$NLIST $NEXT" fi # carrega prximo tem da lista NEXT="$N" fi fi done # Termina a lista # verifica se ltima entrada uma seqencia ou outro nmero if [ "$SEQ" = "+" -a "$NEXT" != "" ]; then NLIST="$NLIST $( seq $NEXT $LAST_NUMBER)" elif [ "$NEXT" != "" ]; then if [ "$NEXT" -le "$LAST_NUMBER" ]; then NLIST="$NLIST $NEXT" fi fi fi # Imprime resultado echo $NLIST # fi exit LAME=$( which lame ) if [ $? = 1 ]; then echo -e "\033[33m\nlame command not found. \033[m" echo -e "\033[33m Please, take lame last version from http://www.mp3dev.org page and install. \033[m" cd2mp3_exit exit fi # Carrega variveis if [ -e $HOME/.local/etc/cd2mp3.sh ]; then # carrega variveis localmente se houver echo "Load parameters in $HOME/.local/etc/cd2mp3.sh" . $HOME/.local/etc/cd2mp3.sh else # carrega variveis padres echo "Load parameters in $DIRBASE/etc/cd2mp3.sh" . $DIRBASE/etc/cd2mp3.sh fi FILEOUT="" # Verifica a entrada de parmetros if [ $# -eq 0 ]; then cd2mp3_use fi # Analiza a entrada de parmetros cd2mp3_parameters $@ # Analiza CD de audio if [ $MP3ONLY -eq 0 ]; then echo -e "\033[1m\033[5m\nChecking tracks. Waiting... \033[m" N_TRACKS=$( cd2mp3_info ) echo -e "\033[1mNumber of tacks: $N_TRACKS \033[m" TRACK_LIST=$( cd2mp3_mklist $TRACKS $N_TRACKS ) fi if [ $MP3ONLY -eq 1 ]; then # Converte arquivos *.wav do diretrio corrente LISTA=$( ls *.wav ) if [ "$LISTA" != "" ]; then for i in ${LISTA}; do lame $LAMEOPTS $i ${i/.wav/.mp3} done else # Caso no exista arquivos *.wav no diretrio corrente echo "\033[31mNo *.wav files in current directory. \033[m" fi else # Cria mp3 a partir de um CD de audio mkdir $FILEOUT 2>/dev/null if [ ! -s $MUSICFILE ]; then for i in $TRACK_LIST; do # Ler track $i echo -e "\033[1m\ncdda2wav -t $i $CDDAOPTS -device $DEVICE \033[m" ###### FIXME: fazer o cdda2wav criar o arquivo wave em $TMPWAV $CDDA2WAV -t $i $CDDAOPTS -device $DEVICE ###### # Gera nome do arquivo de sada AUX="0$i" FILENAME=$FILEOUT"_"${AUX:${#AUX}-2}".mp3" # Converte track $i para mp3 EXEC="$LAME $LAMEOPTS audio.wav $FILEOUT/$FILENAME" echo -e "\033[1m\n$EXEC \033[m" eval $EXEC done else i=1 while read j; do # Ler track $i echo -e "\033[1m\ncdda2wav -t $i $CDDAOPTS -device $DEVICE \033[m" ###### FIXME: fazer o cdda2wav criar o arquivo wave em $TMPWAV $CDDA2WAV -t $i $CDDAOPTS -device $DEVICE ###### # Gera nome do arquivo de sada AUX="0$i" FILENAME=$FILEOUT"_"${AUX:${#AUX}-2}".mp3" # Converte track $i para mp3 EXEC="$LAME $j $LAMEOPTS audio.wav $FILEOUT/$FILENAME" echo -e "\033[1m\n$EXEC \033[m" eval $EXEC let i++ done < $MUSICFILE fi fi cd2mp3_exit

## # Funo de instrues de uso function cd2mp3_use() { echo echo "Use: cd2mp3 [options] <output_name> options -t ... track: -t 1-3; -t -4; -t 5-3,8-; -t all -mp3only convert all *.wav to *.mp3 -f <file> where <file> have an list of tracks names and music information wich lame options keys (-tt, -ta, ...) Example: # list of musics from -tt \"A Man and a woman\" -ta U2 -ty 1986 ... See lame manual \"ID3 tag options\" for more options " rm $CD2MP3_TMP 2>/dev/null cd2mp3_end exit } ## # Funo para ler informaes da mdia de audio function cd2mp3_info() { cdda2wav -J -g -paranoia -H -D $DEVICE 2>$CD2MP3_TMP more $CD2MP3_TMP | grep "^Tracks:" | cut -c8,9 } ## # Funo para processar e separar # Uso # cd2mp3_parameters $@ # $@ lista de parmetros passadas function cd2mp3_parameters() { ALL_PAR=( $@ ) # carrega N_PAR=$# # carrega i=0 os parmetros de entrada do script ao script todos os parmetros o nmero de parmetros

# inicia o contador

45

Bibliografia

Lista de Shell-Script http://brgroups.yahoo.com.br/group/shell-script/

Programao Profissional em Shell-Script , do


Aurlio Marinho Jargas, http://aurelio.net Pginas do manual (man) do sistema GNU/Linux

Advanced Bash-Scripting Guide, Mendel Cooper


http://www.tldp.org/LDP/abs/html/