O documento resume os principais pontos sobre wildcards, variáveis de ambiente e comandos em shell script. Em 3 frases:
Wildcards como * e ? permitem especificar múltiplos arquivos de uma vez para listar, copiar ou apagar. Variáveis de ambiente como $USER e $HOME são definidas pelo sistema operacional e podem ser acessadas em scripts. Comandos como if, for e case permitem estruturar o fluxo de execução em scripts shell.
Oficina de ShellScript: Wildcards, Variáveis e Comandos
1. Oficina de ShellScript
Segunda Parte
Wildcards
Variáveis de Ambiente
Comandos em Shell Script
Parâmetros para o programa
Mais comandos
/dev/null
Bruno L. Albrecht
Felipe A. Chies
PET Computação UFRGS
2. Wildcards
Recurso utilizado para especificar um ou mais
arquivos/diretório de uma vez só.
Permite a filtragem do que será listado/copiado/
apagado/etc
É uma feature que deixa a shell “mais
poderosa” que a GUI no trato de arquivos.
Quatro tipos:
*, ?, [ ] e { }
3. Wildcards
*: qualquer coisa! (zero ou mais caracteres)
rm *.txt → apaga todos os arquivos que terminem
com .txt
?: um único caractere qualquer!
rm log?.txt → log1.txt, loga.txt, lob[.txt, etc
rm *?.* → todos os arquivos não ocultos
Obs.: para nos referirmos a um arquivo que um
wildcard no nome, utilizamos 'wildcard'
4. Wildcards
[ ] : um dos caracteres listados (ou não)
[abcd] : a ou b ou c ou d
[ad] : qualquer um no intervalo de 'a' a 'd'
[!abcd] : qualquer um, menos a,b,c,d
[!ad] : qualquer um, menos os que estão no
intervalo de 'a' a 'd'
Exemplo:
sudo umount /dev/[hs]d[ad][19]
desmonta todos os dispositivos
5. Wildcards
{ } : cada opção separada por vírgulas é
considerada apenas uma vez
echo t{r,igr,rist}es
tres tigres tristes
echo alun{o,a}{,s}
aluno alunos aluno alunos
6. ShellScript: Introdução
Shell
Interpretador de comandos;
Script
É uma descrição geral de qualquer programa
escrito em linguagem interpretada, ou seja, não
compilada;
Temos script em PHP, Ruby, script em PERL e
também Shell Script;
7. Objetivos
Facilitar as tarefas repetidas do adminstrador:
evita a redigitação de comandos;
podem ser agendados para execução através da
tabela crontab (man cron);
Scripts podem fazer tarefas complexas
podemos combinar diversos comandos, com
controladores de fluxo e variáveis;
São “rápidos” de serem criados e não precisam
ser compilados;
8. Hello World
Muito simples!!!
Muito simples:
Crie o arquivo: gedit hello.sh &
#!/bin/bash
echo "Hello World!!!"
Para executálo:
chmod +x hello.sh
./hello.sh
9. Variáveis
O bash reconhece uma variável quando ela
começa com $;
Declaração: var=“valor”
valor pode ser número, frase, outras variáveis ou
comando.
Pode ser expressado entre “ ”(aspas duplas), ' '
(apóstrofes) ou ` `(crases);
11. Entre crases
Crases: vão interpretar os comandos
declarados. Se forem combinados com texto
numa expressão, devese usar as aspas
juntamente!!!
variavel=“Meu diretório atual é: `pwd`”
echo $variavel
Meu diretório atual é: /home/bruno
Obs.: É o mesmo que $(comando)
var=$(pwd)
12. PARÂMETROS
É um array de parâmetros!
De $1 a $9
$0 → nome do programa
$# → quantidade de parâmetros
$* → conjunto de todos os parâmetros
Shift n → utilizado para deslocar n parâmetros
13. Variáveis de Ambiente
São variáveis LOCAIS ou GLOBAIS já
definidas pelo sistema operacioal
Podem ser redefinidas
Exemplo:
O nome do usuário é determinado a partir de uma
variável de ambiente: $USER
14. Variáveis de Ambiente
Principais variáveis globais:
PATH diretório onde podem ser encontrados os
executáveis
USER nome (login) do usuário
HOME diretório home do usuário
HOST nome do host (máquina)
SHELL shell ativo
PS1 mensagem no terminal
IFS separador de parâmetros (default: ” ”)
A lista completa pode ser obtida através do comando
15. Variáveis de Ambiente
Para definir uma variável de ambiente GLOBAL:
export VARIAVEL=conteúdo
Para definir uma variável de ambiente LOCAL:
VARIAVEL=conteudo
Exemplo:
export PATH=$PATH:/meu_dir
Obs.: esta forma de definir variáveis é
TEMPORÁRIA, ou seja, apenas enquanto o shell
estiver ativo
16. Variáveis de Ambiente
Para definir variáveis globais e locais
PERMANENTEMENTE, devemos alterar os
seguintes arquivos:
~./bashrc → somente para o usuário atual
/etc/bash.bashrc → para todos os usuários
Imprimir o conteúdo de uma variável:
echo $VARIAVEL
Deletar uma variável:
unset VARIÁVEL
17. Expressões aritméticas
Para o Shell executar operações aritméticas,
devemos utilizar $((expressão))
echo $((2+2))
var1=$((var2+var1))
Ou então, o comando let:
let var1++
let var2
18. Expressões aritméticas
x++, ++x, x, x: [pós,pré][in,de]cremento
y
x**y: potenciação (x )
x*y, x/y, x%y: multiplicação, divisão, resto
<, <=, >, >=, ==, !=: comparações
&&, ||: AND e OR lógicos
19. Comandos: test
Descrição: testar qualquer coisa!
test $var1 lt $var2
Obs.: resultado em $?
20. if
O comando if testa o STDERR (variável de
ambiente $?), mas, para ficar semelhante à
sintaxe do C, utilizamos o comando test
If test $variavel gt 10 If [ $variavel gt 10 ]
then then
echo ”é maior que 10” echo ”é maior que 10”
else else
echo ”é menor que 10” echo ”é menor que 10”
fi fi
Atalho do comando test no if:
[ expressão ] → não do espaço antes e depois da
expressão
21. case
Para não precisarmos concatenar milhares de
ifs, utilizamos o case:
if [ $var eq 1 ] case $var in
then 1) <comandos> ;;
<comandos> 2) <comandos> ;;
elif [ $var eq 2 ]
3) <comandos> ;;
then
4) <comandos> ;;
<comandos>
elif [ $var eq 3 ] *) <comandos>
then esac
<comandos>
elif [ $var eq 4 ]
● Não há ;; no último grupo
● Para fechar o case, usamos “esac”
then
● Podemos usar wildcards nos padrões de
<comandos>
else grupos. ex.: [14], ?, ??, 3|4, ?0|?5, [1234]
<comandos> etc
fi
22. For
for numero in um dois três quatro cinco
do
echo "Contando: $numero"
done
Um comando muito útil para utilizar o for é o seq,
que gera sequências de números:
for num in $(seq 10) for num in $(seq 6 10)
do do
<...> <...>
done for num in $(seq 0 2 10) done
do
<...>
done
23. For
for par
do
echo "Parâmetro: $par"
done
Neste caso, não colocamos o “in” depois da
variável. Isto serve para a variável (no caso
“par”) receber cada parâmetro passado para o
programa a cada laço do for.
24. For
Podemos ainda usar uma sintaxe parecida com
a do C.
for (( ; i<=9 ; ))
for ((i=0 ; i<=9 ; i++)) do
do let i++;
echo n “$i “ echo n “$i “
done done
Outra forma de for
for arq in * 1 > arquivo1.txt
2 > arquivo2.sh
do 3 > arquivo3.bla
let i++; 4 > arquivo4.doc
echo “$i > $arq” etc...
done
25. Break e Continue
break: pára o laço
continue: ignora o que tem embaixo e volta
para o início do laço
for ((i=0 ; ; i++)) $ ./testefor
0 1 2 3 4 5 6 7 8 9
do
echo n “$i “ for ((i=0 ; ; i++))
if [ i lt 9 ] do $ ./testefor2
then echo n “$i “ 0 1 2 3 4 5 6 7 8 9
continue if [ i eq 9 ]
else then
break break;
done done
26. While
Utilizando um contador com o while:
while :
do
i=0
if test f /tmp/lock
while test i le 10
then
do
echo "Aguardando lock..."
i=$((i+1))
sleep 1
echo "Contando: $i"
else
done
break
fi
done
Para um loop infinito (saindo com break):
27. Until
Igual ao while, mas o teste é feito após os
comandos serem executados
i=0 $./testeuntil
until [ $i eq 9 ] 0 1 2 3 4 5 6 7 8
do $
echo n “$i ”
let i++
done
$ ./testeuntil2
until ! who | grep pet pet pts/0 Jan 4 16:47 (143.54.12.140)
do pet pts/0 Jan 4 16:48 (143.54.12.140)
sleep 60 ...
done pet pts/0 Jan 4 17:39 (143.54.12.140)
echo n “usuário pet foi embora!!” usuário pet foi embora às 17:39h!!
echo “às $(date “%H:%Mh”)” $
28. Interação com o usuário
read: recebe uma lista de parâmetros e salva nas
variáveis
Se houver mais parâmetros do que variáveis, a última
recebe o resto
echo: imprime uma mensagem no STDOUT
$ read var1 var2 var3
Curso de ShellScript $ read var1 var2
$ echo $var1 Curso de ShellScript
Curso $ echo $var1
$ echo $var2 Curso
de $ echo $var2
$ echo $var3 de ShellScript
ShellScript
29. Leitura de Arquivos
Duas formas:
Cat arquivo.txt |
while read LINHA while read LINHA
do do
echo $LINHA echo $LINHA
done < arquivo.txt done
O while termina quando o read encontra um
EOF (leitura mal sucedida)