Escolar Documentos
Profissional Documentos
Cultura Documentos
Um Passeio Pelo Shell Script PDF
Um Passeio Pelo Shell Script PDF
Apresentao
Shell Script
Echo
Variveis
Passando Parmetros
Funo
Redirecionamento
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.
Shell Script
Um programa em shell, geralmente chamado de Script, ou Script
Shell
Shell Script
Recomendaes para a construo de bons Scripts
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
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
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}
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
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
[ t1 -nt t1 ] && echo t1 mais novo que t2 || echo t1 mais velho que t2
22
Estruturas do Bash
Sintaxe do comando for
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
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
...
$#
$*
$@
$$
$?
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>&|
34
Redirecionamento
Exemplos de redirecionamento
$ ls -la > LISTA.TXT
$ startx 2> ERROS-XORG
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
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>
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
43
Awk
Comando awk
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
# 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
# inicia o contador
#
fi
exit
45
Bibliografia
Lista de Shell-Script
http://brgroups.yahoo.com.br/group/shell-script/