Você está na página 1de 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

$ echo -e \nLinux
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 \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
, B=4 Sua
e C=10
idade de $IDADE anos
$ 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)

Strings
=
!=
-ne
-z

igual
diferente
no nula
nula

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

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
shell
server:
> #2;;
3|4|5) echothe
> secure
3,4 ou
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

Substituir a primeira ocorrncias de 2 por -DOIS-:


$ sed 's/2/-DOIS-/' test.txt

Remover a linha contendo 7 :


$ sed '/7 / d' 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
Comando 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 }'

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

##
# 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

#
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

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/

Você também pode gostar