Oficina de ShellScript Segunda Parte Wildcards Variáveis de Ambiente Comans em Shell Script Parâmetros para o programa Mais comans /dev/null Bruno L. Albrecht Felipe A. Chies PET Computação UFRGS
Wildcards Recurso utiliza para especificar um ou mais arquivos/diretório de uma vez só. Permite a filtragem que será lista/copia/ apaga/etc É uma feature que deixa a shell mais poderosa que a GUI no trato de arquivos. Quatro tipos: *,?, [ ] e { }
Wildcards *: qualquer coisa! (zero ou mais caracteres) rm *.txt apaga tos os arquivos que terminem com.txt?: um único caractere qualquer! rm log?.txt log1.txt, loga.txt, lob[.txt, etc rm *?.* tos os arquivos não ocultos Obs.: para nos referirmos a um arquivo que um wildcard no nome, utilizamos '\wildcard'
Wildcards [ ] : um s caracteres listas (ou não) [abcd] : a ou b ou c ou d [a d] : qualquer um no intervalo de 'a' a 'd' [!abcd] : qualquer um, menos a,b,c,d [!a d] : qualquer um, menos os que estão no intervalo de 'a' a 'd' Exemplo: su umount /dev/[hs]d[a d][1 9] desmonta tos os dispositivos
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
ShellScript: Introdução Shell Interpretar de comans; 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;
Objetivos Facilitar as tarefas repetidas adminstrar: evita a redigitação de comans; podem ser agendas para execução através da tabela crontab (man cron); Scripts podem fazer tarefas complexas podemos combinar diversos comans, com controlares de fluxo e variáveis; São rápis de serem crias e não precisam ser compilas;
Hello World Muito simples: simples!!! Crie o arquivo: gedit hello.sh & #!/bin/bash echo "Hello World!!!" Para executá lo: chmod +x hello.sh./hello.sh
Variáveis O bash reconhece uma variável quan ela começa com $; Declaração: var= valor valor pode ser número, frase, outras variáveis ou coman. Pode ser expressa entre (aspas duplas), ' ' (apóstrofes) ou ` `(crases);
Variáveis Aspas duplas: valor da variável será interpreta; variavel="meu login é: $USER" echo $variavel Meu login é: Bruno Apóstrofes: declaração literal variavel='meu login é: $USER' echo $variavel Meu login é: $USER
Entre crases Crases: vão interpretar os comans declaras. Se forem combinas com texto numa expressão, deve se usar as aspas juntamente!!! variavel= Meu diretório atual é: `pwd` echo $variavel Meu diretório atual é: /home/bruno Obs.: É o mesmo que $(coman) var=$(pwd)
PARÂMETROS É um array de parâmetros! De $1 a $9 $0 nome programa $# quantidade de parâmetros $* conjunto de tos os parâmetros Shift n utiliza para deslocar n parâmetros
Variáveis de Ambiente São variáveis LOCAIS ou GLOBAIS já definidas pelo sistema operacioal Podem ser redefinidas Exemplo: O nome usuário é determina a partir de uma variável de ambiente: $USER
Variáveis de Ambiente Principais variáveis globais: PATH diretório onde podem ser encontras os executáveis USER nome (login) usuário HOME diretório home usuário HOST nome host (máquina) SHELL shell ativo PS1 mensagem no terminal IFS separar de parâmetros (default: ) A lista completa pode ser obtida através coman
Variáveis de Ambiente Para definir uma variável de ambiente GLOBAL: export VARIAVEL=conteú Para definir uma variável de ambiente LOCAL: VARIAVEL=conteu Exemplo: export PATH=$PATH:/meu_dir Obs.: esta forma de definir variáveis é TEMPORÁRIA, ou seja, apenas enquanto o shell estiver ativo
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 tos os usuários Imprimir o conteú de uma variável: echo $VARIAVEL Deletar uma variável: unset VARIÁVEL
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 coman let: let var1++ let var2
Expressões aritméticas x++, ++x, x, x: [pós,pré] [in,de]cremento x**y: potenciação (x y ) x*y, x/y, x%y: multiplicação, divisão, resto <, <=, >, >=, ==,!=: comparações &&, : AND e OR lógicos
Comans: test Descrição: testar qualquer coisa! test $var1 lt $var2 Obs.: resulta em $?
if O coman if testa o STDERR (variável de ambiente $?), mas, para ficar semelhante à sintaxe C, utilizamos o coman test If test $variavel gt 10 then echo é maior que 10 else echo é menor que 10 fi If [ $variavel gt 10 ] then echo é maior que 10 else echo é menor que 10 fi Atalho coman test no if: [ expressão ] não espaço antes e depois da expressão
case Para não precisarmos concatenar milhares de ifs, utilizamos o case: if [ $var eq 1 ] then <comans> elif [ $var eq 2 ] then <comans> elif [ $var eq 3 ] then <comans> elif [ $var eq 4 ] then <comans> else <comans> fi case $var in 1) <comans> ;; 2) <comans> ;; 3) <comans> ;; 4) <comans> ;; *) <comans> esac Não há ;; no último grupo Para fechar o case, usamos esac Podemos usar wildcards nos padrões de grupos. ex.: [1 4],?,??, 3 4,?0?5, [1234] etc
For for numero in um is três quatro cinco echo "Contan: $numero" ne Um coman muito útil para utilizar o for é o seq, que gera sequências de números: for num in $(seq 10) <...> ne for num in $(seq 0 2 10) <...> ne for num in $(seq 6 10) <...> ne
For for par echo "Parâmetro: $par" ne Neste caso, não colocamos o in depois da variável. Isto serve para a variável (no caso par ) receber cada parâmetro passa para o programa a cada laço for.
For Podemos ainda usar uma sintaxe parecida com a C. for ((i=0 ; i<=9 ; i++)) echo n $i ne for (( ; i<=9 ; )) let i++; echo n $i ne Outra forma de for for arq in * let i++; echo $i > $arq ne 1 > arquivo1.txt 2 > arquivo2.sh 3 > arquivo3.bla 4 > arquivo4.c etc...
Break e Continue break: pára o laço continue: ignora o que tem embaixo e volta para o início laço for ((i=0 ; ; i++)) echo n $i if [ i lt 9 ] then continue else break ne $./testefor 0 1 2 3 4 5 6 7 8 9 for ((i=0 ; ; i++)) echo n $i if [ i eq 9 ] then break; ne $./testefor2 0 1 2 3 4 5 6 7 8 9
While Utilizan um contar com o while: i=0 while test i le 10 i=$((i+1)) echo "Contan: $i" ne while : if test f /tmp/lock then echo "Aguardan lock..." sleep 1 else break fi ne Para um loop infinito (sain com break):
Until Igual ao while, mas o teste é feito após os comans serem executas i=0 until [ $i eq 9 ] echo n $i let i++ ne until! who grep pet sleep 60 ne echo n usuário pet foi embora!! echo às $(date %H:%Mh ) $./testeuntil 0 1 2 3 4 5 6 7 8 $ $./testeuntil2 pet pts/0 Jan 4 16:47 (143.54.12.140) pet pts/0 Jan 4 16:48 (143.54.12.140)... pet pts/0 Jan 4 17:39 (143.54.12.140) usuário pet foi embora às 17:39h!! $
Interação com o usuário read: recebe uma lista de parâmetros e salva nas variáveis Se houver mais parâmetros que variáveis, a última recebe o resto echo: imprime uma mensagem no STDOUT $ read var1 var2 var3 Curso de ShellScript $ echo $var1 Curso $ echo $var2 de $ echo $var3 ShellScript $ read var1 var2 Curso de ShellScript $ echo $var1 Curso $ echo $var2 de ShellScript
Leitura de Arquivos Duas formas: while read LINHA echo $LINHA ne < arquivo.txt Cat arquivo.txt while read LINHA echo $LINHA ne O while termina quan o read encontra um EOF (leitura mal sucedida)