Buscar

CCT0082 - PROGRAMAÇ_O PARA SERVIDORES

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 74 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 74 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 74 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

CCT0082 - PROGRAMAÇÃO PARA SERVIDORES 
Pré-Requisitos e maturidade acadêmica
Não há pré-requisitos para esta disciplina
Co-requisitos
Não há co-requisitos para essa disciplina
Contextualização
Na atualidade, a quantidade de servidores necessários para o funcionamento de uma organização é cada vez maior. Cada servidor executa diversas atividades, sendo imprescindível o constante monitoramento de suas atividades e a execução de tarefas administrativas em intervalos de tempo regulares a fim de garantir seu correto funcionamento e um desempenho dentro do esperado.
Um shell de um sistema recebe e executa comandos enviados pelos usuários. Mais do que isto, ele possui uma linguagem de programação própria que permite a criação de programas (scripts) visando facilitar a realização de inúmeras tarefas administrativas, permitindo uma personalização rápida e completa do sistema.
A disciplina programação para servidores busca desenvolver no aluno a habilidade para a criação de scripts que permitam o monitoramento e a execução automatizada de procedimentos, visando a garantia do correto funcionamento dos servidores em um ambiente computacional.
Ementa
Definição Básica (scripts para S.O.);  Lógica de Programação de Scripts; Sintaxe; Controle de Fluxo e Funções; Substituição de Comandos; Redirecionamento de E/S; Expressões Regulares.
Objetivos gerais
Criar scripts para personalização de servidores e execução automática de tarefas administrativas.
Objetivos específicos
O aluno deverá ser capaz de personalizar o funcionamento de servidores por intermédio da criação de scripts que permitam a automatização de tarefas e a criação de novos comandos, visando a economia de tempo nas tarefas administrativas e a facilidade de manutenção do sistema computacional.
Conteúdos
1 – INTRODUÇÃO
 1.1 – Definição de shell script
 1.2 – Programação script
 1.3 – Scripts versus linguagens compiladas
 1.4 – Caracteres especiais
 
2- PROGRAMAÇÃO SCRIPT
 2.1 – Variáveis
 2.2 – Testes
 2.3 – Operadores
 2.4 – Loops e desvios
 
3 – COMANDOS
 3.1 – Comandos internos
 3.2 – Comandos externos
 3.3 – Substituição de comandos
 
4 – PROGRAMAÇÃO AVANÇADA
 4.1 – Manipulação de strings
 4.2 – Expressões regulares
 4.3 – Redirecionamento
 4.4 – Pipeline
 4.5 – Segurança, subshell e shell restrito
 4.6 – Funções
 4.7 – Scripts com janelas
 
5 – BACKUP
 5.1 – Scripts para automatização de backup
 5.2 – Agendador de tarefas
Indicação do material didático
Título:  Classic Shell Scripting
Autor: Arnold Robbins
Editora:  Artmed
Ano: 2008
Capítulos:
  2 (20 páginas)
  3 (32 páginas)
  5 (20 páginas)
  6 (28 páginas)
  7 (34 páginas)
  15 (9 páginas)
  Apêndice C (5 páginas) 
Total de 148 páginas
Mapa conceitual
Veja arquivo em anexo 
Procedimentos de ensino
Aulas expositivas abordando os aspectos teóricos e práticos relacionados ao tópico do conteúdo programático.
 
Exercícios em grupo ou individuais para fixação do conteúdo.
 
Práticas em laboratório para fixação dos assuntos abordados.
Recursos
Sala de aula
 
Laboratório de informática
 
Sistema operacional Linux instalado (sugerido o Fedora Core)
Procedimentos de avaliação
O processo de avaliação será composto de três etapas, Avaliação 1 (AV1), Avaliação 2 (AV2) e Avaliação 3 (AV3).
As avaliações poderão ser realizadas através de provas teóricas, provas práticas, e realização de projetos ou outros 
trabalhos, representando atividades acadêmicas de ensino, de acordo com as especificidades de cada disciplina. A soma de todas as atividades que possam vir a compor o grau final de cada avaliação não poderá ultrapassar o grau máximo de 10, sendo permitido atribuir valor decimal às avaliações. Caso a disciplina, atendendo ao projeto pedagógico de cada curso, além de provas teóricas e/ou práticas contemple outras atividades acadêmicas de ensino, estas não poderão ultrapassar 20% da composição do grau final.
A AV1 contemplará o conteúdo da disciplina até a sua realização, incluindo o das atividades estruturadas.
As AV2 e AV3 abrangerão todo o conteúdo da disciplina, incluindo o das atividades estruturadas.
Para aprovação na disciplina o aluno deverá:
1.    Atingir resultado igual ou superior a 6,0, calculado a partir da média aritmética entre os graus das avaliações, sendo 
consideradas apenas as duas maiores notas obtidas dentre as três etapas de avaliação (AV1, AV2 e AV3). A média aritmética 
obtida será o grau final do aluno na disciplina.
2.    Obter grau igual ou superior a 4,0 em, pelo menos, duas das três avaliações.
3.    Frequentar, no mínimo, 75% das aulas ministradas.
Outras informações
Observação
Bibliografia básica
Robbins, A., Classic Shell Scrpting, Artmed Editora, 2008
Cooper, M., Advanced Bash-Scripting Guide, rev 6.2, http://tldp.org, 2010.
Neves, J. C., Programação Shell Linux, 7ª edição, Editora Brasport, 2008.
Plano de Aula: Introdução
PROGRAMAÇÃO PARA SERVIDORES
Título
Introdução
Número de Aulas por Semana
Número de Semana de Aula
1 
Tema
Introdução
Objetivos
Conhecer o docente da disciplina
Conhecer o plano de ensino da disciplina
Definir programação por shell script
Entender as diferenças entre linguagens interpretadas e linguagens compiladas
Reconhecer caracteres especiais em programação shell
Estrutura do Conteúdo
1. Definição de shell script
Shell script é uma linguagem de programação interpretada usada em vários sistemas operacionais.
Na linha de comandos de um interpretador de comandos (shell) pode-se utilizar diversos comandos um após o outro, ou mesmo combiná-los numa mesma linha. Se forem colocados diversas linhas de comandos em um arquivo texto simples, tem-se em um shell script. Uma vez criado, um shell script pode ser reutilizado quantas vezes for necessário.
Todo sistema Unix e similares são repletos de scripts em shell para a realização das mais diversas atividades administrativas e de manutenção do sistema. Os arquivos de lote (batch) do Windows são também exemplos de shell scripts.
Por serem facilmente agendados para execução através do crontab, os shell scripts são usados para construções de ferramentas indispensáveis aos administradores de sistemas Unix.
Dentre as principais razões para se utilizar shell scripts, podem ser citadas:
Simplicidade ? Por ser uma linguagem de alto nível, é possível expressar operações complexas de forma e simples.
Portabilidade ? Por ser universal entre sistemas Unix, existe uma grande chace de um shell script escrito para um sistema ser transferido para outro sem necessidade de alterações.
Facilidade de desenvolvimento ? Pode-se desenvolver um shell script poderoso e útil em pouco tempo.
2. Programação script
O conhecimento básico de programação script é essencial para quem deseja tornar-se um administrador de sistemas. Durante o processo de boot uma máquina Linux executa os shell scripts em /etc/rc.d para configurar o sistema e os serviços. Uma compreensão detalhada de tais scripts de inicialização é importante para analisar o comportamento de um sistema e, possivelmente, modificá-lo.
A programação script não é difícil de dominar, pois scripts podem ser construídos em pequenas seções, existindo apenas um conjunto relativamente pequeno de operadores específicos e opções para aprender. A sintaxe é simples e direta, semelhante à execução de forma encadeada de utilitários na linha de comando, e há apenas algumas regras que regem a sua utilização.
3. Scripts versus linguagens compiladas
A maioria dos programas, notadamente os comerciais, são escritos em linguagens compiladas. Tais programas devem ser traduzidos para um código objeto (por intermédio de um compilador) e posteriormente ligados a funções em bibliotecas (por intermédio de um linkeditor) a fim de se obter um programa executável. Os programas executáveis podem ser executadosdiretamente pelo hardware do computador. A grande vantagem na utilização programas escritos em linguagens compiladas é a performance que se obtém.
Linguagens script geralmente são linguagens interpretadas, ou seja, as instruções são buscadas no programa uma após outra a fim de serem executadas. A grande vantagem na utilização de scripts é sua simplicidade e rapidez para o desenvolvimento de tarefas simples e repetitivas, características da administração de sistemas.
4. Caracteres especiais
Caracteres especiais são caracteres que possuem um significado além do seu significado literal. Alguns caracteres especiais:
# ? Linhas que se iniciam com o caractere # são consideradas comentário, ou seja não são executadas. Também são comentários caracteres que venha logo após um # (desde que haja pelo menos um caractere em branco antes do #).
; ? Separador de comandos. Utilizado para permitir a execução de dois ou mais comandos em uma mesma linha.
;; ? Terminador do comando case.
. ? O caractere ponto representa um caractere qualquer em uma expressão regular.
" ? Protege de interpretação vários caracteres especiais da string que se encontrar entre aspas.
' ? Protege de interpretação todos os caracteres especiais da string que se encontrar entre aspas simples.
\ ? Funciona como escape para permitir que caracteres especiais tenham seu significado literal.
/ ? Separador de nomes em um caminho de diretório.
` ? Substituição de comando.
? ? Operador de teste.
$ ? Substituição de variável ou padrão.
( ) ? Agrupamento de comandos.
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 2 do livro “Classic Shell Scripting”.
Procedimentos de Ensino
Esta primeira aula poderá ser totalmente desenvolvida em sala de aula, sem necessidade da utilização do laboratório de informática.
Começar a aula pela apresentação do professor, suas titulações e vivências que possui em área correlata à disciplina.
Apresentar a contextualização da disciplina, a ementa, o conteúdo programático e a bibliografia a ser utilizada no curso.
Apresentar o plano de ensino.
Apresentar o calendário destacando as principais datas e como a ementa será desenvolvida de acordo com o calendário. Se possível, prever qual matéria será cobrada em cada avaliação.
Começar a aula expositiva destacando a importância da programação shell para um administrador de sistemas. Ressaltar que o bash não está presente apenas no Linux, mas na maioria dos sistemas operacionais Unix-Like.
Definir o que é shell script e em que situações é adequado utilizar programação script. Mostrar no quadro um pequeno script para que o aluno possa melhor visualizar do que se trata programação script.
Mostrar exemplos de caracteres especiais.
Promover em sala discussão sobre vantagens e desvantagens de se utilizar linguagem script para criação de programas.
Comentar sobre o livro “Advanced Bash-Scripting Guide”, de autoria de Mendel Cooper. Trata-se de um livro livre sobre programação bash cujo download pode ser feito a partir de “http://tldp.org”. O livro também encontra-se anexado ao plano de ensino desta disciplina.
Recursos Físicos
Sala de aula.
Opcionalmente pode ser utilizado projetor multimídia como apoio às aulas e para mostrar exemplo de shell script.
Avaliação
Algumas questões podem ser formuladas aos alunos durante a aula:
Qual a diferença entre linguagens script e linguagens compiladas?
Qual a correlação entre scripts e interpretadores de comandos?
Considerações Adicionais
Plano de Aula: Programação Script 1
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação Script 1
Número de Aulas por Semana
Número de Semana de Aula
2 
Tema
Variáveis e Testes
Objetivos
Entender como funciona a substituição de variáveis em shell script.
Conhecer os tipos de variáveis especiais utilizados em programação shell.
Conhecer as formas de proteção de variáveis com aspas.
Conhecer os mecanismos de testes em shell script.
Estrutura do Conteúdo
 1. Variáveis 
Variável é a forma que as linguagens de programação utilizam para representar dados. Uma variável nada mais é do que um rótulo, um nome atribuído a uma posição ou conjunto de posições na memória do computador contendo um item de dados. Cada variável possui um valor, que representa a informação que foi atribuída a ela.
Em shell script, o nome de uma variável inicia sempre por uma letra ou por um sublinhado, e pode conter qualquer quantidade de letras, dígitos e/ou sublinhados. O conteúdo de uma variável é armazenado como um string e não há limite para a quantidade de caracteres que ela pode conter.
A atribuição de valores a uma variável é feita escrevendo-se o nome da variável seguido imediatamente do caractere = e o valor a ser atribuído, sem qualquer espaço entre eles. Para atribuir a uma variável valor que contenha espaços, o valor deverá ser colocado entre aspas. Alguns exemplos de atribuição de valores a variáveis:
tipo=jogador
nome=”Edson Nascimento”
Para obter o valor de uma variável utiliza-se o caractere $ precedendo seu nome. Por exemplo:
echo $nome
Para limpar o valor de uma variável basta fazer uma atribuição nula. Por exemplo:
nada=
Ao contrário de muitas linguagens de programação, o shell não separa suas variáveis por tipo. Em shell script as variáveis são sequências de caracteres (strings), mas dependendo do contexto podem ser realizadas operações aritméticas sobre as variáveis.
2. Argumentos
Argumentos são passados para o script a partir da linha de comando por intermédio das variáveis $0, $1, $2, $3, ... , onde $0 é o nome do próprio script, $1 é o primeiro argumento, $2 o segundo argumento, e assim por diante. Depois de 9, os argumentos devem ser colocados entre parênteses. Por exemplo, $(10), $(11), $(12), ...
3. Proteção com aspas
Proteção com aspas (quoting) é a forma utilizada para informar ao shell como interpretar os dados passados.
3.1 Escape com barra invertida
Preceder um caractere com uma barra invertida (\) diz ao shell para tratar literalmente o caractere.
3.2 Aspas simples
Aspas simples ('......') forçam o shell a tratar literalmente tudo o que estiver entre o par de aspas.
Não é possível encaixar aspas simples dentro de uma string protegida por aspas simples, pois nem a barra invertida é especial dentro de aspas simples.
3.3 Aspas duplas
Aspas duplas ("......") agrupam o texto como uma única string, porém o shell processa caracteres de escape, variáveis, substituição de comandos, etc.
4. Testes
O construtor if/then testa se a saída do comando anterior é 0 (em UNIX, 0 significa sucesso), e em caso afirmativo, executa uma ou mais comandos.
Existe um comando específico, denominado [ (caractere especial colchete esquerdo). Ele considera seus argumentos como expressões de comparação ou testes em arquivos e retorna um status de saída correspondente ao resultado da comparação (0 para verdadeiro e 1 para falso).
Em versões mais recentes do shell foi introduzido o comando [[ ... ]], que estendeu os comandos de teste realizando comparações de uma forma mais familiar para os programadores de outras linguagens.
O construtor if/then pode testar a saída de qualquer comando, não se limitando apenas a testes entre colchetes.
if [ 1 ]
then
 echo "verdadeiro"
else
 echo "falso"
fi
De uma forma mais ampla, a estrutura do construtor if/then pode ser:
if [ condicao1 ]
then
 commando1
 commando2
 commando3
elif [ condicao2 ]
then
 command4
 command5
else
 comando_default
fi
4.1 Teste em arquivos
Alguns operadores para teste em arquivos:
-e ? arquivo existe
-f ? é um arquivo regular (não é diretório nem dispositivo)
-s ? não tem tamanho zero
-d ? é um diretório
-b ? é um dispositivo de bloco
-c ? é um dispositivo de caractere
-r ? tem permissão de leitura
-w ? tem permissão de escrita
-x ? tem permissão de execução
if [-f $arquivo ]
then
 echo "$arquivo e um arquivo regular"
else
 echo "$arquivo nao existe ou nao e um arquivo regular"
fi
Mais detalhes sobre testes em arquivos podem ser encontrados no capítulo 7.2 do livro Advanced Bash-Scripting Guide, de M. Cooper, cuja revisão 6.2 em formato eletrônico encontra-se anexada ao plano de ensino desta matéria.
4.2 Operadores de comparação
Comparação de inteiros:
-eq ? igual
-ne ? diferente
-gt ? maior que
-ge ? maior ou igual
-lt ? menor que
-le ? menor ou igual
if [ "$a" -ne "$b" ]
then
 echo "$a nao e igual a $b"
fi
Comparação de strings:
= ? igual
== ? igual (mesmo que =)
!= ? diferente
< ? menor que (em ordem alfabética ASCII)
> ? maior que (em ordem alfabética ASCII)
-z ? string é nula (tem tamanho zero)
-n ?string não é nula
if [ -n "$str" ]
then
 echo "a string nao e nula"
else
 echo "a string e nula"
fi
Comparação composta:
-a ? “e” lógico
-o ? “ou” lógico
if [ "$expr1" -a "$expr2" ]
then
 echo "expr1 e expr2 sao verdadeiras"
else
 echo "expr1 ou expr2 eh falsa"
fi
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 6 do livro “Classic Shell Scripting”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Desenvolver o conteúdo explicando o que são variáveis e sua importância para qualquer linguagem de programação. Explicar que argumentos de scripts são variáveis especiais e fornecer exemplos de comandos com argumentos.
Comentar sobre o comando shift utilizado para rotacionar argumentos.
Explicar o funcionamento da barra invertida como caractere de escape e mostrar exemplos de seu funcionamento tanto em strings com aspas simples quanto em strings com aspas duplas.
Mostrar exemplos e aplicações de caracteres de escape.
Comentar os parâmetros do comando echo e falar do funcionamento de saída formatada com o comando printf.
Explicar o funcionamento do construtor if/then assim como sua utilização em conjunto com operadores de teste.
Comentar sobre o comando test. Detalhes de seu funcionamento podem ser encontrados no capítulo 7.1 do livro Advanced Bash-Scripting Guide, de M. Cooper, cuja revisão 6.2 em formato eletrônico encontra-se anexada ao plano de ensino desta matéria. Também podem ser encontrados no capítulo 6.2.4 (página 137) do livro Classic Shell Scrpting, de Arnold Robbins.
Utilizar os 2 últimos tempos em laboratório.
Mostrar aos alunos como editar scripts no Linux. É sugerido mostrar a edição de arquivos tanto em modo texto quanto por intermédio de programas da interface gráfica (gedit, por exemplo).
Enfatizar que é preciso mudar as permissões de acesso do arquivo para que possa ser executado diretamente, ou então chamar o script como parâmetro do bash.
Incentivar o aluno a desenvolver scripts de modo a fixar o conteúdo da aula.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Solicitar que os alunos descrevam o que ocorre no script:
if [ -f $HOME/.Xclients ]; then
 exec $HOME/.Xclients
elif [ -f /etc/X11/xinit/Xclients ]; then
 exec /etc/X11/xinit/Xclients
else
 # failsafe settings. Although we should never get here
 # (we provide fallbacks in Xclients as well) it can't hurt.
 xclock -geometry 100x100-5+5 &
 xterm -geometry 80x50-50+150 &
 if [ -f /usr/bin/netscape -a -f /usr/share/doc/HTML/index.html ]; then
 netscape /usr/share/doc/HTML/index.html &
 fi
fi
Considerações Adicionais
Plano de Aula: Programação Script 2
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação Script 2
Número de Aulas por Semana
Número de Semana de Aula
3 
Tema
Operadores, repetições e tomadas de decisões
Objetivos
Conhecer os operadores utilizados em shell script
Compreender as estruturas de repetições e desvios
Discernir qual a melhor estrutura a ser utilizada em cada caso
Ser capaz de utilizar estruturas de repetição e tomadas de decisão na construção de scripts
Estrutura do Conteúdo
1. Operadores
O principal operador em shell scrip é o operador de atribuição (=). Ele atribui um valor a uma variável, porém o faz interpretando tudo o que vem a direita do = como uma string. Por exemplo, o comando
a=5+3
armazena a string “5+3” na variável a. Para efetuar a operação matemática deve ser utilizado o comando let:
let a=5+3
que neste caso irá efetuar a operação de soma e armazenar o resultado “8” na variável a.
Os interpretadores de comandos mais atuais trabalham com variáveis inteiras de 64 bits, enquanto números em ponto flutuante são tratados como strings.
Operadores matemáticos:
+ ? soma
- ? subtração
* ? multiplicação
/ ? divisão
** ? exponenciação
% ? módulo
+= ? incremento por uma constante
-= ? decremento por uma constante
*= ? multiplica por uma constante
/= ? divide por uma constante
%= ? módulo por uma constante
Operadores bit a bit:
<< ? deslocamento a esquerda
<<= ? deslocamento a esquerda por uma constante
>> ? deslocamento a direita
>>= ? deslocamento a direita por uma constante
& ? “E”
| ? “OU”
~ ? negação
^ ? “OU exclusivo”
Operadores booleanos:
! ? não
&& ? “E”
|| ? “OU”
2. Estruturas de repetição
Estruturas de repetição são blocos de código que têm sua execução repetida enquanto uma determinada condição for verdadeira.
2.1 for
A estrutura for interage sobre uma lista de objetos, executando um bloco de comandos para cada objeto. Objetos podem ser qualquer coisa que possa ser criada em forma de lista. Por exemplo, para executar determinadas operações a todos os arquivos que possuam extensão “.txt”, o seguinte trecho de código pode ser utilizado:
for i in *.txt
do
 comando_1
 comando_2
 ...
 comando_n
done
Outros exemplos de for:
for j in "$var1" "$var2" "$var3" "$var4"
do
 comando_1
 comando_2
 ...
 comando_n
done
for k in "1 2 3 4 5 6 7 8 9 10"
do
 comando_1
 comando_2
 ...
 comando_n
done
2.2 while
O while testa uma condição no início de um laço e fica em loop enquanto essa condição for verdadeira. Ao contrário do laço for, o while é utilizado em situações onde o número de repetições do laço não é conhecido de antemão. Sua sintaxe é:
while condição
do
 comando_1
 comando_2
 ...
 comando_n
done
Exemplo de utilização do while:
LIMIT=10
a=1
while [ "$a" -le $LIMIT ]
do
 echo -n "$a "
 let "a+=1"
done
2.3 until
O until testa por uma condição no início de um laço e fica em loop enquanto esta condição for falsa (seu funcionamento é o oposto do while). Sua sintaxe é:
until condição
do
 comando_1
 comando_2
 ...
 comando_n
done
Exemplo de utilização do until:
LIMIT=10
var=0
until [ "$var" -ge $LIMIT ]
do
 echo -n "$var "
 let "var+=1"
done
3. Tomada de decisão
Se for preciso verificar o valor de uma variável dentre muitos, podem ser utilizados uma série de encadeamento de testes if e elif. Porém o shell possui a construção case que pode ser utilizada com muito mais facilidade para o casamento de padrões. Sua sintaxe é:
case "$variavel" in 
 "$condicao1" ) 
 comando... 
 ;; 
 "$condicao2" ) 
 comando... 
 ;; 
esac
Exemplo da utilização do case:
case "$arch" in
 i386 ) echo "maquina 80386";;
 i486 ) echo "maquina 80486";;
 i586 ) echo "maquina Pentium";;
 i686 ) echo "maquina Pentium2+";;
 * ) echo "outro tipo de maquina";;
esac
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 11 do livro “Advanced Bash-Scripting Guide”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Apresentar os operadores utilizados em programação shell enfatizando que seu funcionamento estará condicionado à utilização docomando let.
Apresentar aos alunos a precedência entre operadores e os problemas que podem ocorrer caso a precedência não seja observada.
Apresentar os conceitos de estrutura de repetição e tomada de decisão fazendo um paralelo com sua utilização prática. Utilizar fluxogramas para melhor exemplificar seu funcionamento.
Utilizar os 2 últimos tempos em laboratório.
Passar tarefa aos alunos para que eles desenvolvam scripts utilizando os operadores e as estruturas apresentados em sala de aula.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Fazer os seguintes scripts:
1. Cálculo de fatorial
Solicitar a leitura de uma variável (utilizar o comando read) e fornecer como saída o fatorial deste número.
2. Cálculo de IMC (Ìndice de Massa Corporal)
Sabendo-se que o IMC de uma pessoa consiste em seu peso divido pelo quadrado se sua altura, fazer um script que solicite o peso e a altura de uma pessoa e forneça como saída seu IMC. O script deverá ainda dizer quanto a pessoa deverá perder ou ganhar (e se deverá perder ou ganhar) para ficar com IMC=24,7.
3. Arquivos em /etc
Fazer um script que liste todos os diretórios dentro do diretório /etc e, ao final, mostre o total de diretórios encontrados. Não devem ser listados arquivos comuns.
Considerações Adicionais
Plano de Aula: Comandos 1
PROGRAMAÇÃO PARA SERVIDORES
Título
Comandos 1
Número de Aulas por Semana
Número de Semana de Aula
4 
Tema
Comandos internos
Objetivos
Conhecer os comandos internos de um shell
Adquirir conhecimento para o desenvolvimento de scripts mais eficientes
Estrutura do Conteúdo
O domínio dos comandos de um sistema é indispensável para escrever scripts eficazes.
Um comando interno (ou builtin) é um comando contido dentro do shell. Comandos são construídos internamente ao sheel por razões de desempenho ou por necessidades específicas de acesso direto à informações internas ao shell.
1. Comandos de entrada/saída
echo
O comando echo imprime na saída padrão uma expressão ou variável. Parâmetros
-e ? trata caracteres de escape
-n ? suprime o new line do final
O echo utilizado pelo interpretador de comandos é um comando interno. Não confundir com o programa /bin/echo que tem comportamento similar.
printf
O comando printf é uma melhoria do comando echo, fornecendo uma saída formata. Sua sintaxe é:
printf formato parâmetros
O formato segue o padrão do comando printf da linguagem C.
read
Lê um valor a partir de STDIN (por padrão o teclado) e o armazena em uma variável. Parâmetros:
-s ? não mostrar os caracteres digitados
-n N ? ler no máximo N caracteres
-p “string” ? mostrar “string” antes da leitura
2. Comandos do sistema de arquivos
cd
Muda o diretório de trabalho (diretório no qual o script irá atuar durante sua execução).
pwd
Retorna o diretório de trabalho corrente.
3. Comandos que atuam sobre variáveis
let
Executa operações matemáticas sobre variáveis e expressões.
set
Altera o valor de variáveis internas do shell.
unset
Remove o valor de variáveis internas do shell. Na prática as coloca com valoe null.
export
Torna a variável passada como parâmetro disponível para processos filho.
readonly
Torna uma variável disponível somente para leitura (a torna uma constante). Tentativas de alterar seu valor irão provocar uma mensagem de erro.
4. Comandos que afetam o comportamento do script
source
O comando source, que tem a mesma funcionalidade do comando ponto (.), importa os comandos do script passado como parâmetro e os executa localmente.
exit
Encerra a execução do script.
exec
Substitui o processo corrente pelo programa passado como parâmetro. 
5. Comandos para controle de jobs
jobs
Lista os processos executando em segundo plano no shell, fornecendo o número do job.
fg
Trás para o primeiro plano um job que está executando em segundo plano.
bg
Coloca em execução em segundo plano um job cuja execução tenha sido suspensa.
kill
Força o encerramento de um processo enviando ao processo um código de encerramento.
killall
Força o encerramento de um processo passado a ele o nome do processo. 
6. Outros comandos
true
Sempre retorna um código de saída de sucesso (valor 0).
false
Sempre retorna um código de saída sem sucesso.
help
Fornece uma tela de ajuda sobre a utilização de comandos internos.
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 15 do livro “Advanced Bash-Scripting Guide”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Explicar a diferença entre comandos internos e comandos externos.
Explicar os comandos internos listados na estrutura do conteúdo, fornecendo exemplos de funcionamento de cada um deles. Mostrar os principais parâmetros utilizados e como eles afetam o comportamento do comando.
Scripts com exemplos do funcionamento dos comandos internos podem ser encontrados no capítulo 15 do livro Advanced Bash-Scripting Guide, de M. Cooper, cuja revisão 6.2 em formato eletrônico encontra-se anexada ao plano de ensino desta matéria
Utilizar os 2 últimos tempos em laboratório.
Passar tarefa aos alunos para que eles desenvolvam scripts utilizando os comandos apresentados em sala de aula.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Durante os 2 últimos tempos de aula (em laboratório) passar exercícios para que os alunos desenvolvam scripts que utilizem os comandos vistos em sala de aula.
Considerações Adicionais
Plano de Aula: Comandos 2
PROGRAMAÇÃO PARA SERVIDORES
Título
Comandos 2
Número de Aulas por Semana
Número de Semana de Aula
5 
Tema
Comandos externos
Objetivos
Conhecer os comandos externos de um shell
Adquirir conhecimento para o desenvolvimento de scripts mais eficientes
Estrutura do Conteúdo
A possibilidade de utilização de comandos e aplicativos do sistema operacional tornam scripts do shell mais poderosos. Tal poder vem da união dos comandos do sistema e diretivas do shell com construções simples de programação.
1. Comandos básicos
ls
Comando básico para listar o conteúdo de um diretório. Alguns parâmetros:
-R ? lista os subdiretórios recursivamente
-S ? ordena pelo tamanho do arquivo
-t ? ordena pela hora de modificação
-r ? reverte a ordenação
-a ? mostra arquivos ocultos (iniciados por .)
-h ? mostra em formato mais apropriado para leitura humana
-l ? utiliza formato longo para mostrar atributos de arquivos
cat
Envia o conteúdo do arquivo para a saída padrão (por padrão o monitor). O parâmetro -n faz com que as linhas do arquivo sejam numeradas.
tac
Similar ao cat, porém as linhas do arquivo são mostradas da última para a primeira.
rev
Envia o conteúdo do arquivo para a saída padrão (por padrão o monitor), mas mostra as linhas de trás para frente. A ordem das linhas são mantidas, porém são mostrados do último ao primeiro caractere da linha.
cp
Cópia de arquivos. Alguns parâmetros:
-f ? força a cópia
-i ? interativo (pergunta antes de sobrescrever)
-R, -r ? copia diretórios recursivamente
-v ? mostra os arquivos que estão sendo copiados
mv
Move arquivos. Também utilizado para renomear. Alguns parâmetros:
-f ? força a movimentação
-i ? interativo (pergunta antes de sobrescrever)
-v ? mostra os arquivos que estão sendo movidos
rm
Remove (deleta) arquivos. Alguns parâmetros:
-f ? força a remoção
-i ? interativo (pergunta antes de remover)
-R, -r ? remove diretórios recursivamente
-v ? mostra os arquivos que estão sendo removidos
rmdir
Remove diretórios vazios.
mkdir
Cria diretório.
chmod
Muda os atributos de arquivos e diretórios.
ln
Cia links para arquivos e diretórios.
man, info
Fornece informações sobre o funcionamento dos comandos externos.
2. Comandos para manipulação de data e hora
date
Mostra a data e a hora do sistema. Tambémé utilizados para acertar a data/hora.
time
Mostra estatísticas de utilização de tempo do processo executado como parâmetro.
at
Programa um aplicativo para executar automaticamente em determinada data/hora.
cal
Mostra um calendário.
sleep
Suspende a execução por uma dada quantidade de segundos.
hwclock, clock
Consulta ou acerta a hora no relógio do hardware.
3. Comandos para processamento de texto
sort
Mostra um arquivo em ordem alfabética.
uniq
Remove linhas duplicadas de um arquivo ordenado.
head
Envia as primeiras linhas de um arquivo para a saída padrão.
tail
Envia as últimas linhas de um arquivo para a saída padrão. Quando utilizado com o parâmetro -f o comando continua mostrando novas linhas que são adicionadas ao arquivo (útil para monitorar arquivos de log).
wc
Conta a quantidade de linhas, palavras e caracteres em um arquivo.
nl
Numera as linhas de um arquivo.
4. Comandos para arquivamento
tar
Junta vários arquivos em um único arquivo ou dispositivo.
gzip
Faz a compressão de um arquivo. Normalmente utilizado em conjunto com o tar quando é necessário fazer a compressão de mais de um arquivo.
bzip2
Outro programa para compressão de arquivo. Normalmente mais eficiente que o gzip.
zip, unzip
Programas para manipulação de arquivo comprimido no formato zip.
arj, unarj
Programas para manipulação de arquivo comprimido no formato arj.
rar, unrar
Programas para manipulação de arquivo comprimido no formato rar.
file
Identifica o tipo de um arquivo.
which
Mostra em que diretório se encontra determinado arquivo.
diff
Compara 2 arquivos e mostra as diferenças entre eles.
sum, cksum, md5sum, sha1sum, sha256sum
Comandos para gerar hash de arquivos a fim de verificar sua integridade.
more, less
Pagina arquivos e os envia para a saída padrão. O comando less permite um maior controle sobre a paginação. 
5. Comandos do sistema
su
Executa um programa como um usuário substituto ou inicia um shell como outro usuário.
uname
Exibe informações sobre o sistema.
free
Mostra o total de memória RAM e swap utilizada pelo sistema.
du
Mostra o total de espeço em disco utilizado (recursivamente) por arquivos e/ou diretórios.
df
Mostra a utilização dos discos/partições.
dmesg
Mostra todas as mensagens emitidas durante o processo de boot do sistema.
uptime
Mostra por quanto tempo o sistema está em execução.
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 16 do livro “Advanced Bash-Scripting Guide”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Explicar os comandos externos listados na estrutura do conteúdo, fornecendo exemplos de funcionamento de cada um deles. Mostrar os principais parâmetros utilizados e como eles afetam o comportamento do comando.
Scripts com exemplos do funcionamento dos comandos internos podem ser encontrados no capítulo 16 do livro Advanced Bash-Scripting Guide, de M. Cooper, cuja revisão 6.2 em formato eletrônico encontra-se anexada ao plano de ensino desta matéria
Utilizar os 2 últimos tempos em laboratório.
Passar tarefa aos alunos para que eles desenvolvam scripts utilizando os comandos apresentados em sala de aula.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Durante os 2 últimos tempos de aula (em laboratório) passar exercícios para que os alunos desenvolvam scripts que utilizem os comandos vistos em sala de aula.
Considerações Adicionais
Plano de Aula: Comandos 3
PROGRAMAÇÃO PARA SERVIDORES
Título
Comandos 3
Número de Aulas por Semana
Número de Semana de Aula
6 
Tema
Substituição de comandos, redirecionamento, pipe e manipulação de strings
Objetivos
Aprender a executar comandos externos e capturar sua saída padrão
Aprender a redirecionar as entradas e saídas de programas
Aprender a fazer a ligação entre saída e entrada de processos
Compreender como o shell manipula strings
Estrutura do Conteúdo
1. Substituição de comandos
A substituição de comandos é utilizada para reatribuir a saída de um comando (ou de múltiplos comandos). A saída do comando pode ser utilizada como argumento para outro comando, ser atribuída a uma variável ou ser utilizada para gerar uma lista de argumentos para um loop for.
A forma tradicional de se utilizar substituição de comandos é executar o comando entre crases (`...`). Por exemplo, o código:
lista=`ls /etc`
coloca na variável lista o conteúdo do ditetório “/etc”.
A substituição de comandos pode gerar mais de um argumento. Por exemplo:
comando `echo a b` # 2 argumentos: a e b
comando "`echo a b`" # 1 argumento: "a b"
comando `echo` # sem argumentos
comando "`echo`" # 1 argumento vazio
Quando a substituição de comandos ocorre entre crases os caracteres newline são preservados, caso contrário eles são removidos. Por exemplo, o trecho de código:
lista=`ls teste`
echo $lista
apresentará como saída:
abacate ameixa banana cacau laranja mamao melancia melao morango pera pessego uva
enquanto o trecho de código:
lista=`ls teste`
echo "$lista"
apresentará como saída:
abacate
ameixa
banana
cacau
laranja
mamao
melancia
melao
morango
pera
pessego
uva
Utilizando a substituição de comandos também é possível transferir o conteúdo de um arquivo para uma variável:
arq=`cat /etc/passwd`
2. Redirecionamento
Para todo processo existem sempre 3 arquivos abertos por padrão:
stdin ? entrada padrão (teclado)
stdout ? saída padrão (monitor)
stderr ? saída de erros (monitor)
Estes e quaisquer outros arquivos abertos podem ser redirecionados. Redirecionamento significa capturar a saída de um arquivo, comando, programa, script ou até mesmo um bloco de código em um script e o enviar como entrada para outro arquivo, comando, programa ou script.
Cada arquivo aberto recebe um descritor de arquivo. Os descritores de arquivo para stdin, stdout e stderr são 0, 1 e 2, respectivamente.
O “>” redireciona a saída padrão (stdout) para um arquivo. Se o arquivo não existir ele será criado, caso contrário será sobrescrito e seu conteúdo anterior será perdido.
O “>>” também redireciona a saída padrão (stdout) para um arquivo. Se o arquivo não existir ele será criado. Porém, caso o arquivo exista, a saída do comando irá ser acrescentada ao final do arquivo.
O “2>” redireciona a saída de erros (stderr) para um arquivo. Se o arquivo não existir ele será criado, caso contrário será sobrescrito e seu conteúdo anterior será perdido.
O “2>>” também redireciona a saída padrão (stdout) para um arquivo. Se o arquivo não existir ele será criado. Porém, caso o arquivo exista, a saída do comando irá ser acrescentada ao final do arquivo.
ARQ_LOG=script.log
ARQ_ERRO=script.err
echo "Primeira linha enviada ao arquivo de log" > $ARQ_LOG
echo "Segunda linha enviada ao arquivo de log" >> $ARQ_LOG
echo "Terceira linha enviada ao arquivo de log" >> $ARQ_LOG
echo "Quarta linha enviada ao arquivo de log" >> $ARQ_LOG
echo "Quinta linha enviada ao arquivo de log" >> $ARQ_LOG
comando_errado 2> $ARQ_ERRO
De uma forma mais geral, para redirecionar do descritor de arquivos M para o descritor de arquivos N, utiliza-se “M>&N”. Por exemplo, “2>&1” redireciona stderr para stdout.
O “<” redireciona um arquivo para a entrada padrão (stdin).
O comando a seguir utiliza o programa sort para ordenar um arquivo. A entrada padrão do sort recebe como redirecionamento o arquivo a ser ordenado (nomes.txt) e a saída padrão é redirecionada para o arquivo que conterá as linhas ordenadas pelo sort (nomes_ordenados.txt).
sort <nomes.txt >nomes_ordenados.txt
3. Pipe
O pipe ( | ) é um mecanismo especial de redirecionamento utilizado para conectar a saída padrão de um processo à entrada padrão de outro processo.
Por exemplo, o código:
cat *.txt | sort | uniq > resultado.txt
junta todos os arquivoscom extensão .txt ordenando suas linhas e retirando as duplicadas.
O processo que se encontra à esquerda do pipe tem sua saída padrão redirecionada automaticamente para a entrada padrão do processo que se encontra à direita do pipe.
4. Manipulação de strings
Tamanho da string
O tamanho de uma string pode ser obtido por intermédio de ${#string}. Por exemplo:
echo "A string str possui ${#str} caracteres."
Índice
Encontra em uma string a posição numérica do primeiro caractere de uma substring que exista na string. Por exemplo, o comando:
str="Talita levou Maria para passear"
substr="Maria"
echo `expr index "$str" "$substr"`
irá mostrar o valor 2, pois o primeiro caractere existente tanto em str quanto em substr é o caractere “a”, e encontra-se na segunda posição de str. O primeiro caractere possui índice 1.
Extração de substring
O comando ${string:pos:tamanho} extrai de string uma substring de tamanho caracteres a partir da posição pos. Caso tamanho seja omitido, será extraída a substring iniciando em pos e indo até o final. Por exemplo:
str="Talita levou Maria para passear"
substr="Maria"
echo "${str:13:5}"
irá mostrar a string “Maria”. O primeiro caractere possui índice 0.
Remoção de substring
${string#substring} remove a menor porção de string que combinar com o padrão de substring a partir do início da string.
${string##substring} remove a maior porção de string que combinar com o padrão de substring a partir do início da string.
${string%substring} remove a menor porção de string que combinar com o padrão de substring a partir do final da string.
${string%%substring} remove a maior porção de string que combinar com o padrão de substring a partir do final da string.
stringZ=abcABC123ABCabc
# |----| menor
# |----------| maior
echo ${stringZ#a*C} # 123ABCabc
echo ${stringZ##a*C} # abc
stringZ=abcABC123ABCabc
# || menor
# |------------| maior
echo ${stringZ%b*c} # abcABC123ABCa
echo ${stringZ%%b*c} # a
Troca de substring
${string/substring/substituta} troca a primeira ocorrência de substring por substituta.
${string//substring/substituta} troca todas as ocorrências de substring por substituta.
Aplicação Prática Teórica
Estudo dirigido: leitura dos capítulos 5 e 7 do livro “Classic Shell Scripting”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Explicar como funciona a substituição de comandos com crases enfatizando que qualquer programa externo pode ser executado desta forma. Explicar a diferença entre executar o comando entre crases ou não.
Explicar como funciona o redirecionamento da entrada e da saída padrão, assim como seu relacionamento com o pipe. Enfatizar que durante o pipe os comandos não são executados em sequência, mas sim em paralelo.
Explicar como se dá a manipulação de strings em shell script. Scripts com vários exemplos de manipulação de strings, incluindo outras formas de manipulá-las, podem ser encontrados no capítulo 10.1 do livro Advanced Bash-Scripting Guide, de M. Cooper, cuja revisão 6.2 em formato eletrônico encontra-se anexada ao plano de ensino desta matéria.
Utilizar os 2 últimos tempos em laboratório.
Passar tarefa aos alunos para que eles desenvolvam scripts utilizando os assuntos apresentados em sala de aula.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Durante os 2 últimos tempos de aula (em laboratório) passar exercícios para que os alunos desenvolvam scripts que utilizem os assubntos vistos em sala de aula.
Considerações Adicionais
Plano de Aula: Exercícios 1
PROGRAMAÇÃO PARA SERVIDORES
Título
Exercícios 1
Número de Aulas por Semana
Número de Semana de Aula
7 
Tema
Exercícios
Objetivos
Fixar os conceitos apresentadas até a presente aula
Avaliar o nível de conhecimento adquirido
Estrutura do Conteúdo
1) Fazer um script que receba como parâmetro 2 números e retorne:
1 ? caso o primeiro seja maior que o segundo
0 ? caso os dois sejam iguais
-1 ? caso o primeiro seja menor que o segundo
2) Repetir o script anterior para strings.
3) Fazer um script que receba um número como parâmetro e faça a contagem até 0. A contagem deverá ser regressiva se o número for positivo e progressiva se o número for negativo. Deverá ser respeitado o intervalo de 1 segundo entre a apresentação de cada número.
4) Fazer um script que receba como parâmetro 2 strings e retorne em que posição a segunda string aparece dentro da primeira string. O primeiro caractere deverá ser contado como 1 e o valor 0 deverá ser retornado caso a segunda string não apareça dentro da primeira.
5) Fazer um script que receba como parâmetro 3 notas e imprima a média do aluno e se ele está aprovado ou reprovado. Para a média deverão ser consideradas apenas as 2 maiores notas. Para aprovação as duas notas consideradas devem ser maior ou igual a 4 e a média maior ou igual a 6.
6) Fazer um script que receba como parâmetro uma nome e imprima uma série de linhas, onde na primeira linha apareça apenas a primeira letra do nome, na segunda linha as duas primiras letras, e assim por diante. Por exemplo, para o nome “Rita”, imprimir:
R
Ri
Rit
Rita
7) Fazer um script que imprima todos os números múltiplos de 13 entre 1 e 300.
8) Fazer um script que imprima:
Bom dia ? das 06:00 às 11:59
Boa tarde ? das 12:00 às 17:59
Boa noite ? das 18:00 às 5:59
9) Fazer um script que receba 2 números e escreva o dividendo, o divisor, o quociente e o resto.
10) Solicite 2 números e gere uma sequência de 10 números onde cada número (a partir do terceiro) é a soma dos 2 números anteriores.
11) Fazer um script que receba uma data no formato DD/MM/AAAA e forneça separadamente o dia, o mês e o ano.
12) Fazer um script que receba um número e imprima de ele é primo. Caso não seja, mostrar seus divisores.
Aplicação Prática Teórica
Exercícios descritos na “estrutura do conteúdo”.
Procedimentos de Ensino
Preferencialmente utilizar os 4 tempos em laboratório. Em caso de impossibilidade, utilizar os 2 primeiros temos em sala de aula para desenvolvimento dos algoritmos e os 2 últimos em laboratório para implementação.
Passar a lista de exercícios aos alunos e solicitar que eles desenvolvam os scripts.
Recursos Físicos
Laboratório de informática com Linux instalado.
Avaliação
Aplicar os exercícios descritos na “estrutura do conteúdo”.
Considerações Adicionais
Plano de Aula: Programação avançada 1
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação avançada 1
Número de Aulas por Semana
Número de Semana de Aula
8 
Tema
Expressões regulares
Objetivos
Conhecer os fundamentos de expressões regulares
Ser capaz de criar consultas cujos resultados sejam mais rápidos e precisos
Estrutura do Conteúdo
Uma expressão regular é um método formal de se especificar um padrão de texto. Uma composição de caracteres com funções especiais que, agrupados entre si e com caracteres literais, formam uma expressão. Essa expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer casar com essa regra, ou seja, obedecer exatamente a todas as suas condições. Expressões regulares permitem pesquisar por um texto que se encaixe em determinado critério, permitindo que se escreva uma única expressão que pode selecionar múltiplas strings de dados.
1. Metacaracteres
Expressões regulares são constituídas a partir de:
caracteres normais
caracteres especiais
Os caracteres especiais (ou metacaracteres) podem ser:
representantes
quantificadores
âncoras
outros
Metacaracteres representantes
	Metacaractere
	Mnemônico
	Função
	.
	ponto
	um caractere qualquer
	[...]
	lista
	lista de caracteres permitidos
	[^...]
	lista negada
	lista de caracteres proibidos
Metacaracteres quantificadopresMetacaractere
	Mnemônico
	Função
	?
	opcional
	zero ou um
	*
	asterisco
	zero, um ou mais
	+
	mais
	um ou mais
	{n, m}
	chaves
	de n até m
Metacaracteres âncoras
	Metacaractere
	Mnemônico
	Função
	^
	circunflexo
	início da linha
	$
	cifrão
	final da linha
	\b
	borda
	início ou fim de palavra
Outros metacaracteres
	Metacaractere
	Mnemônico
	Função
	\c
	escape
	torna literal o caractere c
	|
	ou
	ou um ou outro
	(...)
	grupo
	delimita um grupo
	\1...\9
	retrovisor
	texto casado nos grupos 1...9
Não confundir os curingas da linha de comando com metacaracteres de expressão regular. Eles possuem funcionalidades diferentes.
1.1 Metacaracteres tipo representante
Os metacaracteres representantes casam com a posição de um único caractere.
O metacaractere . (ponto) casa com qualquer coisa (letra, número, tabulação, @, etc.), inclusive com o caractere ponto.
Exemplos:
	Expressão
	Casamento
	n.o
	não, nao, n.o, n5o, nAo, ...
	e.tendido
	estendido, extendido, entendido, ...
	12.45
	12:45, 12 45, 12345, 12.45, ...
	<.>
	<B>, <i>, <p>, ...
A lista guarda os caracteres com o qual o casamento é permitido. Caso apareça algum caractere que não conste da lista não haverá o casamento.
Exemplos:
	Expressão
	Casamento
	n[ãa]o
	não, nao
	e[sn]tendido
	estendido, entendido
	12[:. ]45
	12:45, 12.45, 12 45
	<[BIP]>
	<B>, <I>, <P>
Dentro da lista todos são caracteres normais. Assim o ponto é considerado como o caractere ponto, não como o metacaractere ponto.
A lista também aceita intervalos. Exemplos:
[0-9] ? [0123456789]
[a-z] ? [abcdefghijklmnopqrstuvwxyz]
[A-Z] ? [ ABCDEFGHIJKLMNOPQRSTUVWXYZ]
[3-8] ? [345678]
[d-h] ? [defgh]
Letras maiúsculas, minúsculas e números ? [A-Za-z0-9]
Para que o traço possa ser utilizado em uma lista ele deve estar no final da lista. Assim o padrão [a-g-] casa com as letras de a até g e com o traço.
Os colchetes também devem receber atenção especial. Para representar o colchete que abre não tem problema, ele pode estar em qualquer posição, porém o colchete que fecha deve ser obrigatoriamente o primeiro item da lista, caso exista.
A lista [][-] casa com ], [, ou -.
Algumas classes especiais
	Classe POSIX
	Significado
	[:upper:]
	letras maiúsculas
	[:lower:]
	letras minúsculas
	[:alpha:]
	letras maiúsculas e minúsculas
	[:alnum:]
	letras e números
	[:digit:]
	números
	[:xdigit:]
	números hexadecimais
	[:punct:]
	sinais de pontuação
	[:blank:]
	espaço e tabulação
	[:space:]
	caracteres brancos (\t\n\r\f\v)
	[:cntrl:]
	caracteres de controle
	[:graph:]
	caracteres imprimíveis
	[:print:]
	caracteres imprimíveis e o espaço
Os colchetes fazem parte da classe, assim [[:upper:]] é uma classe POSIX dentro de uma lista.
As classes POSIX levam em conta a localidade. Assim, no Brasil [:upper;] engloba ABCDEFGHIJKLMNOPQRSTUVWXYZÇÁÀÂÃÉÈÊÕÍÌÎÓÔÒÕÚÛÙ...
A lista negada funciona com lógica inversa à lista, ou seja, ela guarda os caracteres com os quais o casamento não é permitido. Por exemplo, [^0-9] significa poder casar com qualquer coisa, exceto dígitos.
1.2 Metacaracteres tipo quantificador
Metacaracteres quantificadores indicam o número de repetições permitidas para a entidade imediatamente anterior. 
O ? (opcional) indica que a entidade anterior pode ocorrer 0 ou 1 vez.
Exemplos:
	Expressão
	Casamento
	casas?
	casa, casas
	fala[r!]?
	falar, fala!, fala
	</?[BIPbip]>
	</B>, </I>, </P>, </b>, </i>, </p>, <B>, <I>, <P>, <b>, <i>, <p>
O * indica que a entidade anterior pode aparecer quantas vezes for necessário (0, 1 ou mais).
Exemplos:
	Expressão
	Casamento
	3*4
	4, 34, 334, 3334, 33334, 333334, ..., 33333333333333333334, ...
	bi*p
	bp, bip, biip, biiip, ..., biiiiiiiiiiiiip, ...
	b[ip]*
	b, bi, bp, bip, bpipippp, bipiiippi, ...
O .* representa qualquer caractere em qualquer quantidade.
O + tem funcionamento parecido com o *, porém ele obriga que case pelo menos uma vez.
Exemplos:
	Expressão
	Casamento
	3+4
	34, 334, 3334, 33334, 333334, ..., 33333333333333333334, ...
	bi+p
	bip, biip, biiip, ..., biiiiiiiiiiiiip, ...
	b[ip]+
	bi, bp, bip, bpipippp, bipiiippi, ...
O {n,m} significa repetir a entidade anterior um mínimo de n e um máximo de m vezes.
Exemplos:
	Expressão
	Casamento
	3{1,3}4
	34, 334, 3334
	bi{2,5}p
	biip, biiip, biiiip, biiiiip
	no{4}ta
	noooota
	fu{3,}i
	fuuui, fuuuui, fuuuuui, fuuuuuui, ...
1.3 Metacaracteres tipo âncora
Metacaracteres do tipo âncora marcam uma posição específica na linha.
O ^ indica que o casamento deve ocorrer no início da linha. Assim ^[0-9] indica que a linha deve ser iniciada com um número. Já ^[^0-9] indica que está sendo procurada uma linha que não se inicia com número.
O $ indica que o casamento deverá ocorrer no final da linha. Assim [0-9]$ indica que a linha deverá terminar com um número.
Outros exemplos:
	Expressão
	Casamento
	^$
	linha vazia
	.....$
	5 últimos caracteres de uma linha
	^.{15-80}$
	linhas com 15 a 80 caracteres
O \b indica uma borda, ou seja, o limite de uma palavra.
Exemplos:
	Expressão
	Casamento
	dia
	dia, diafragma, radial, melodia, bom-dia!
	\bdia
	dia, diafragma, bom-dia!
	dia\b
	dia, melodia, bom-dia!
	\bdia\b
	dia, bom-dia!
1.4 Outros metacaracteres
O \ funciona como um caractere de escape. Ele serve para que metacaracteres tenham significado literal. Assim, \. significa o caractere ponto, não o metacaractere ponto.
Para representar um número de CPF com formato nnn.nnn.nnn-nn pode-se utilizar [0-9]{3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}
O | funciona como um ou, podendo ser escolhida uma opção. Assim boa-tarde|boa-noite procura pela ocorrência de “ boa-tarde” ou de “boa-noite”. Uma lista também funciona como ou, mas para um caractere somente.
Pode-se juntar vários caracteres ou metacaracteres entre parênteses para formar um grupo.
Exemplos:
	Expressão
	Casamento
	(ha!)+
	ha!, ha!ha!, ha!ha!ha!, ...
	(\.[0-9]){3}
	.0.6.2, .2.8.9, .6.6.6, ...
	boa-(tarde|noite)
	boa-tarde, boa-noite
	(#|n\.|núm) 6
	# 6, n. 6, núm 6
	(in|con)?certo
	incerto, concerto, certo
O \1...\9 busca um trecho que já tenha casado com um grupo para reutilizá-lo. Assim (quero)-\1 casa com quero-quero. De forma mais ampla, ([A-Za-z]+)-\1 casa com qualquer palavra repetida separada por traço.
Outros exemplos:
	Expressão
	Casamento
	(lenta)(mente) é \2 \1
	lentamente é mente lenta
	((band)eira)nte \1 \2a
	bandeirante bandeira banda
	in(d)ol(or) é sem \1\2
	indolor é sem dor
	((((a)b)c)d)-1 = \1,\2,\3,\4
	abcd-1 = abcd,abc,ab,a
Aplicação Prática Teórica
Estudo dirigido: leitura do artigo sobre expressões regulares disponível em “http://guia-er.sourceforge.net/”.
Procedimentos de Ensino
Utilizar os 4 tempos em sala de aula.
Antes de desenvolver o conteúdo em sala de aula, explicar da importância que tem para um administrador de sistemas o uso de expressões regulares.
Explicar que expressões regulares serão utilizadas como parâmetros em comandos como grep, sed, awk, etc.
Desenvolver o conteúdo procurando fazer um paralelo entre cada metacaractere com exemplos do cotidiano.
Mais detalhes e exemplos de expressões regulares podem ser encontrados na página eletrônica “http://guia-er.sourceforge.net/”.
Recursos Físicos
Sala de aula.
Avaliação
Escrever expressões regulares para casar com:
a palavra “frase” no singular e no plural
a palavra “letra” podendo conter qualquer combinação de letras maiúsculas e minúsculas
números inteiros
hora de 00:00 a 23:59
um endereço de email válido
um endereço IP válido
Considerações Adicionais
Plano de Aula: Programação avançada 2
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação avançada 2
Número de Aulas por Semana
Número deSemana de Aula
9 
Tema
Funções
Objetivos
Conhecer a sintaxe de definição de funções em shell script
Conhecer o procedimento de passagem de parâmetros e código de retorno
Conhecer o escopo de uma variável em uma função
Entender o funcionamento de recursividade em shell script
Escrever programas mais claros e concisos
Estrutura do Conteúdo
1. Funções
Uma função é um bloco de código que implementa um conjunto de operações para desempenhar uma tarefa específica. Tal função pode então ser chamada a partir de múltiplos lugares de dentro do programa principal ou de outras funções.
Uma função deve ser definida entes de ser utilizada. Isto pode ser feito no início do script ou em um arquivo separado e incluído no programa com o comando “.” (ponto).
A sintaxe para a definição de uma função é:
function nome_da_função { 
comandos... 
} 
Outra forma:
nome_da_função ( ) { 
comandos... 
} 
Por exemplo, o trecho de código:
msg () {
echo "Mostrando uma mensagem."
}
chamadora () {
echo "Entrando na funcao chamadora."
msg
echo "Saindo da funcao chamadora."
}
chamadora
msg
mostrará como saída:
Entrando na funcao chamadora.
Mostrando uma mensagem.
Saindo da funcao chamadora.
Mostrando uma mensagem.
2. Argumentos e status de saída
Funções podem processar argumentos passados durante sua chamada. Assim como scripts, funções recebem argumentos através das variáveis $1, $2, $3, etc.
A função
mostra_soma () {
if [ -z "$1" ]
then
a=0
else
a=$1
fi
if [ -z "$2" ]
then
b=0
else
b=$2
fi
let soma=$a+$b;
echo "$a + $b = $soma";
}
é um exemplo de função que utiliza parâmetros.
As funções enxergam somente os parâmetros passados a elas, ou seja, elas não acessam parâmetros passados ao script.
Funções podem retornar valores de status de saída (exit status) similares aos retornados por um comando. O status de saída pode ser definido explicitamente pelo comando return, caso contrário ele será o valor retornado pelo último comando executado na função. O valor 0 significa que foi executado com sucesso. O status de saída pode ser verificado pelo script acessando a variável $?.
O comando return termina a execução de um script e opcionalmente retorna um valor de saída. O valor de saída deve ser obrigatoriamente um valor numérico.
3. Variáveis locais
Uma variável pode ser declarada com o comando local para que seu escopo fique reduzido à função na qual ela foi definida.
Abaixo a utilização de uma variável que não foi definida com escopo local:
func () {
let soma=$1+$2
echo "$1 + $2 = $soma"
}
soma=8
echo "$soma" # mostra 8
func 2 3 # mostra 2 + 3 = 5
echo "$soma" # mostra 5
Depois que ela foi definida com escopo local:
func () {
local soma
let soma=$1+$2
echo "$1 + $2 = $soma"
}
soma=8
echo "$soma" # mostra 8
func 2 3 # mostra 2 + 3 = 5
echo "$soma" # mostra 8
4. Recursividade
A programação shell script permite funções realizem chamadas recursivas, porém há um impacto significativo no desempenho do sistema.
Deve-se ter atenção especial à utilização de variáveis quando estiver utilizando funções com chamadas recursivas.
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 24 do livro “Advanced Bash-Scripting Guide”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Explicar que um script em shell executa dentro de um interpretador de comando e que a implementação de funções embora exista, é ainda uma implementação precária.
Mostrar as formas de se definir uma função e enfatizar que a definição deverá ocorrer antes de sua utilização.
Mostrar exemplos de funções e passagem de parâmetros. Comentar sobre as variáveis $0, $1, $2, etc., em especial sobre o escopo de tais variáveis.
Explicar a diferença entre variáveis locais e variáveis globais. Mostrar exemplos de problemas que podem ocorrer com o uso de variáveis não declaradas como locais a uma função.
Mostrar e explicar o funcionamento de uma função recursiva.
Utilizar os 2 últimos tempos em laboratório.
Passar exercícios para fixação do conteúdo. Sugerido os exercícios descritos na “aplicação prática e teórica”.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
1. Escrever uma função que receba 2 números e retorne como código de status:
0 se os números forem iguais
1 se o primeiro for menor que o segundo
2 se o primeiro for maior que o segundo
Escrever um script que utilize e teste a função.
2. Escrever uma função que receba como parâmetro um número e imprima a sequência de Fibonacci contendo apenas números menor do que àquele passado como parâmetro. Sequência de Fibonacci = 0 1 1 2 3 5 8 13 21 …, onde o próximo da sequência é a soma dos 2 anteriores.
3. Escreva uma função que receba como parâmetros A e B e calcule AB.
4. Escreva uma função recursiva para calcular o fatorial de um número passado como parâmetro.
Considerações Adicionais
Plano de Aula: Programação avançada 3
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação avançada 3
Número de Aulas por Semana
Número de Semana de Aula
10 
Tema
Subshell e shell restrito
Objetivos
Conhecer subshells
Entender o funcionamento de um subshell
Aprender a criar rotinas paralelas com subshell
Entender os mecanismos de segurança de um shell restrito
Estrutura do Conteúdo
1. Subshell
Um subshell é uma instância separada do processador de comandos. Assim como comandos são interpretados pelo prompt da linha de comando, um script é um processamento batch de uma lista de comandos. Cada shell script sendo executado é efetivamente um subprocesso (processo filho) de um shell.
Um shell script pode por si criar subprocessos. Tais subshells permitem ao script realizar um processamento paralelo, executando múltiplas subtarefas simultaneamente.
Para criar um subshell dentro de um script, colocar os comandos do subshell entre parênteses. Por exemplo, criar o script de nome “teste_subshell.sh” com o seguinte conteúdo:
(
while [ 1 ]
do
 sleep 1
 echo "Dentro do loop 1 ..."
done
)
e executar com o comando:
bash teste_subshell.sh
Se em outro terminal entrar com o comando:
ps -ef | grep teste_subshell.sh
será apresentado:
UID PID PPID C STIME TTY TIME CMD
root 25357 31092 0 21:01 pts/2 00:00:00 bash teste_subshell.sh
root 25358 25357 0 21:01 pts/2 00:00:00 bash teste_subshell.sh
mostrando que o script que possui PID 25357 deu origem ao subshell 25358.
Um comando externo executado em um script gera um subprocesso, enquanto um comando interno não gera qualquer subprocesso. Por isto um comando interno executa mais rápido e consome menos recursos que comandos externos equivalentes.
Variáveis em um subshell não são visíveis fora do bloco do subshell, não sendo, assim, acessíveis pelo processo pai. Desta forma um subshell pode ser utilizado para criar um ambiente específico para determinado bloco de comandos.
COMANDO1
COMANDO2
(
PATH=/home/fabio/bin
COMANDO3
COMANDO4
exit # sai apenas do subshell
)
# o shell pai não eh afetado e seu ambiente eh preservado
COMANDO5
COMANDO6
1.1 Execução paralela dentro de um subshell
Para colocar um comando executando em segundo plano basta colocar o símbolo & no final do comando. Da mesma forma para executar um subshell em segundo plano basta colocar o símbolo & após o fechamento do parentese.
(
while [ 1 ]
do
 sleep 1
 echo "Dentro do loop 1 ..."
done
)&
(
while [ 1 ]
do
 sleep 1
 echo "Dentro do loop 2 ..."
done
)&
(
while [ 1 ]
do
 sleep 1
 echo "Dentro do loop 3 ..."
done
)
No exemplo acima o primeiro e o segundo blocos executam paralelamente em segundo plano, enquanto o terceiro bloco executa em paralelo aos dois primeiros.No exemplo abaixo o script termina sua execução mas os dois blocos anteriores continuam executando em segundo plano até terminarem seus respectivos loops.
(
i=1
while [ $i -le 5 ]
do
 sleep 1
 echo "Dentro do loop 1 ($i)..."
 let i=i+1
done
)&
(
i=1
while [ $i -le 5 ]
do
 sleep 2
 echo "Dentro do loop 2 ($i)..."
 let i=i+1
done
)&
echo "Fim do script."
Para fazer com que o script continue sua execução somente após o termino dos blocos que estão em segundo plano, pode ser utilizado o comando interno wait:
(
i=1
while [ $i -le 5 ]
do
 sleep 1
 echo "Dentro do loop 1 ($i)..."
 let i=i+1
done
)&
(
i=1
while [ $i -le 5 ]
do
 sleep 2
 echo "Dentro do loop 2 ($i)..."
 let i=i+1
done
)&
wait
echo "Fim do script."
2. Shell restrito
Executar um script ou parte de um script em modo restrito desativa alguns comandos, tornando-os indisponíveis. É uma medida de segurança destinada a limitar os privilégios do usuário do script e minimizar possíveis danos causados pela execução do script.
Os seguintes comandos e ações são desabilitados:
Utilizar o comando cd para alterar o diretório.
Alterar os valores das variáveis de ambiente $PATH, $SHELL, $BASH_ENV ou $ENV.
Ler ou alterar opções do shell ($SHELLOPTS).
Redirecionar a saída.
Executar comando contendo uma ou mais barras (/).
Chamar exec para substituir o shell por um processo diferente.
#!/bin/bash
# Iniciando o script com "#!/bin/bash -r"
# executa todo o script em modo restrito
echo
echo "Mudando o diretorio."
cd /usr/local
echo "Agora em `pwd`"
echo "Voltando para o home."
cd
echo "Agora em `pwd`"
echo
# Ate aqui tudo normal, estamos em modo n restrito
set -r
echo "==> Agora em modo restrito. <=="
echo
echo "Tentando mudar o diretorio em modo restrito."
cd ..
echo "Ainda em in `pwd`"
echo
echo "\$SHELL = $SHELL"
echo "Tentando mudar o shell em modo restrito."
SHELL="/bin/ash"
echo
echo "\$SHELL = $SHELL"
echo
echo "Tentando redirecionar a saida em modo restrito."
ls -l /usr/bin > bin.files
ls -l bin.files
echo
exit 0
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 15 do livro “Classic Shell Scripting”.
Procedimentos de Ensino
Utilizar os 2 primeiros tempos em sala de aula.
Explicar como funciona um subshell, lembrando como é a criação de subprocessos em Linux. Explicar que o PPID do subshell será o PID do pai.
Explicar o funcionamento de comandos entre parênteses.
Explicar que qualquer comando externo gera um subprocesso, ao contrário dos comandos internos. Explicar o impacto no desempenho.
Comentar sobre o escopo de variáveis dentro de um subshell.
Explicar como é o funcionamento de rotinas paralelas em um programa e como fazer rotinas paralelas utilizando subshells.
Explicar o que é um shell restrito e sua importância para o desenvolvimentos de scripts seguros. Explicar como criar shells restritos.
Utilizar os 2 últimos tempos em laboratório.
Solicitar que os alunos implementem os códigos listados neste plano de aula, testem e interpretem os resultados.
Recursos Físicos
Sala de aula.
Laboratório de informática com Linux instalado.
Avaliação
Escrever um script que junte e ordene os arquivos arq1, arq2 e arq3. Em paralelo, o script deve juntar e ordenar os arquivo arq4, arq5 e arq6. Após a ordenação (que deverá ter ocorrido em paralelo) o script deverá exibir as diferenças encontradas entre os arquivos ordenados.
Considerações Adicionais
Plano de Aula: Programação avançada 4
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação avançada 4
Número de Aulas por Semana
Número de Semana de Aula
11 
Tema
Pesquisa e substituição
Objetivos
Aprender a realizar pesquisas complexas em arquivos texto
Aprender a modificar o conteúdo de arquivos texto de forma automatizada
Aprender a unir campos de arquivos diferentes
Aprender a reorganizar campos de arquivos
Estrutura do Conteúdo
1. Pesquisando textos
Para a pesquisa de textos o programa mais utilizado é o grep, que permite a busca desde simples strings até expressões regulares. Pode-se entender o grep como um conjunto de 3 programas:
grep ? Utiliza expressões regulares básicas para realizar a pesquisa.
egrep ? Utiliza expressões regulares estendidas para realizar a pesquisa.
fgrep ? Versão otimizada do grep para realizar pesquisa por strings. Por não procurar por expressões regulares, seu funcionamento é muito mais rápido que o grep e o egrep.
A sintaxe do grep é
grep [opções...] padrão [arquivos...]
O grep lê cada arquivo passado pela linha de comando e quando a linha cada com o padrão pesquisado ele mostra a linha. Quando múltiplos arquivos são passados o nome do arquivo seguido de dois pontos (“:”)precede a linha.
Dependendo das opções passadas, o grep pode assumir as funções do egrep e do fgrep, tornando-os obsoletos. As principais opções do grep são:
-E ? Pesquisa utilizando expressões regulares estendidas (substitui o egrep).
-F ? Pesquisa utilizando strings fixas (substitui o fgrep).
-e lista_de_padrões ? Indica que o que segue o “-e” é uma lista de padrões a ser seguida, e não opções do grep. Pode-se utilizar múltiplas opções “-e” ou “-f” para construir uma lista de padrões a serem pesquisados.
-f arquivo ? Indica que os padrões de pesquisa encontram-se em um arquivo.
-i ? Ignora diferenças entre maiúsculas e minúsculas.
-l ? Mostra os arquivos que casaram com o padrão no lugar de mostrar a linha no arquivo.
-q ? Em vez de mostrar os resultados da pesquisa apenas retorna se obteve ou não sucesso na pesquisa.
-s ? Suprime as mensagens de erro.
-v ? Mostra as linhas que não casam com o padrão.
2. Substituição de texto
Muitos scripts, notadamente os voltados para gerar mensagens enviadas automaticamente, baseiam-se em um texto padrão que será modificado de acordo com seu destinatário ou finalidade, de forma semelhante a uma “mala direta” de um editor de textos.
O programa mais utilizado para tarefas como esta é o sed (stream editor). As sintaxes mais comuns do sed são:
sed [-n] 'comando_de_edição' [arquivo...]
sed [-n] -e 'comando_de_edição' ... [arquivo...]
sed [-n] -f arquivo_script ... [arquivo...]
O sed recebe um fluxo de texto como entrada e produz o resultado na saída padrão, sem modificar os arquivos originais. O sed é um programa capaz de realizar tarefas complexas, muito além de simples substituição de textos (seu uso mais comum).
As principais opções do sed são:
-e ? Para indicar que serão utilizados múltiplos comandos de edição.
-f ? Ler os comandos a partir de um arquivo.
-n ? Suprimir a impressão normal das linhas modificadas. As linhas deverão ser impressas explicitamente com o comando p.
2.1 Utilização básica
O uso básico do sed para substituição de textos é por intermédio do comando s, que procura por um texto utilizando expressão regular e o substitui por outro texto. A sintaxe do comando é:
s/expressão_regular/texto_substituto
Para, por exemplo, listar todos os usuários do sistema, pode-se listar o arquivo “etc/passwd” e remover todo o texto que vem após o primeiro dois-pontos (“:”). Isto pode ser feito com:
sed s/:.*// /etc/passwd
O comando s do sed atua somente na primeira ocorrência na linha. Para atuar em todas as ocorrências é preciso utilizar o sufixo g no comando. Por exemplo, para trocar todas as ocorrências da palavra amendoim por castanha em receita.txt, deve-se utilizar:
sed s/amendoim/castanha/g receita.txt
No lugar do sufixo g também pode ser utilizado um número, indicando que deverá ser aquela ocorrência na linha que será substituída. Por exemplo, 2 indica que ira ser substituída apenas a segunda ocorrência da expressão regular em cada linha.
A opção “-n” do sed suprime a impressão das linhas. Assim as linhas a serem impressasdevem ser selecionadas explicitamente com o comando p. O comando abaixo mostra somente as linhas que possuam a string “root” no arquivo “/etc/passwd”.
sed -n /root/p /etc/passwd
2.2 Procurando em linhas específicas
É possível restringir as linhas que o sed irá atuar prefixando o comando com um endereço. As formas de se endereçar linhas são:
expressões regulares ? Colocando uma expressão regular antes de um comando ele irá atuar somente sobre as linhas que casarem com o padrão.
última linha ? Colocando o símbolo $ antes do comando estará limitando a execução do comando à ultima linha fornecida. O $ deve ser protegido por uma contrabarra (“\”) ou por aspas simples.
números de linha ? Coloca-se o número da linha antes do comando.
faixas ? Pode-se especificar uma faixa de linhas separando os endereços por vírgula.
expressões regulares negadas ? Acrescentando um caractere ! após uma expressão regular serão selecionadas as linhas que não casarem com a expressão regular. O ! deve ser protegido por uma contrabarra (“\”) ou por aspas simples.
Segue abaixo exemplo de um script que recebe um valor n e um nome de arquivo como parâmetros e mostra as n primeiras linhas do arquivo.
contagem=$1
sed -n 1,${contagem}p "$2"
3. Pesquisa por campos
Um arquivo pode ser considerado como um local onde são armazenados vários registros, sendo cada registro armazenado em uma linha do arquivo. Um registro normalmente contém uma séria de campos separados espaços em branco, tabulações ou por algum caractere. O arquivo de usuários do Unix, por exemplo, separa os campos utilizando o caractere dois pontos (“:”).
Para selecionar campos em um arquivo normalmente é utilizado o programa cut, que foi projetado selecionar um ou mais campos ou grupos de caracteres de um arquivo de entrada. Sua sintaxe é:
cut opções... [arquivo...]
Suas principais opções são:
-c lista ? Corte baseado em caracteres. A lista é separada por vírgulas (caracteres individuais) ou traços (faixas de caracteres).
-d delim ? Utiliza delim como delimitador de campos para a opção “-f”.
-f lista ? Corte baseado em campos. A lista é separada por vírgulas (campos individuais) ou traços (faixas de campos).
Para extrair os nome de usuário e seus diretórios home pode ser utilizado o comando:
cut -d: -f 1,6 /etc/passwd
4. Unindo campos
Com o comando join é possível unir registros de arquivos diferentes que possuam uma chave em comum. O arquivo deve estar ordenado por tal chave.
A sintaxe do comando join é:
join [opções...] arquivo1 arquivo2
As principais opções do join são:
-1 campo1 -2 campo2 ? Especifica os campos sobre os quais a união deve ser feita. O valor numérico campo1 especifica o campo de arquivo1, enquanto o valor numérico campo2 especifica o campo de arquivo2.
-o arq.pos ? Faz com que a saída seja composta pelo campo pos do arquivo arq. Múltiplas opções “-o” podem ser utilizadas para selecionar múltiplos campos de saída.
-t separador ? Separador a ser utilizados tanto nos arquivos de entrada quanto na saída. Por padrão é utilizado espaço em branco como separador.
5. Rearranjando campos
Para rearranjar campos o programa mais utilizado é o awk, mas o awk é na verdade uma linguagem de programação criada com a finalidade de facilitar ações em shell script.
O awk lê uma linha por vez do arquivo de entrada e para cada linha aplica ele aplica comandos conforme especificado para a linha. A estrutura básica de um programa awk é:
padrão {ação}
padrão {ação}
padrão {ação}
...
O padrão é uma expressão regular cercada por barras, enquanto ação é um comando awk. Um padrão omitido faz com que ação seja executada em todas as linhas, e uma ação omitida faz com que a linha seja impressa (equivalente a {print}).
O awk lê linhas de entrada e automaticamente quebra a linha em campos. É definida uma variável interna NF que guarda o número de campos da linha.
Por padrão os campos são separados por espaços em branco, porém o valor da variável FS pode ser definida com um novo valor de separador. Para comandos simples pode ser utilizado o parâmetro “-F” para definir um novo separador.
Para, por exemplo, mostrar os diretórios home dos usuários seguidos de seu nome, pode-se utilizar o comando:
awk -F: '{print $6, $1}' /etc/passwd
Para mostrar os usuários do sistema, com nome completo e nome do grupo inicial, pode-se utilizar o script abaixo.
# separa os campos GID, USERNAME e NOME_COMPLETO,
# ordena e armazena em arquivo temporario
awk -F: '{print $4":"$1":"$5}' /etc/passwd | sort -n > arq1.temp
# separa os campos GID e NOME_DO_GRUPO,
# ordena e armazena em arquivo temporario
awk -F: '{print $3":"$1}' /etc/group | sort -n > arq2.temp
# une os arquivos temporios
join -t: arq1.temp arq2.temp | awk -F: '{print "Usuario: " $2 "\nNome: " $3 "\nGrupo inicial: " $4 "\n"}'
# apaga os arquivos temporarios
rm arq1.temp arq2.temp
Aplicação Prática Teórica
Estudo dirigido: leitura do capítulo 3 do livro “Classic Shell Scripting”.
Procedimentos de Ensino
Preferencialmente utilizar os 4 tempos em laboratório. Caso não seja possível, utilizar os 2 primeiros tempos em sala de aula para explorar os conceitos e os 2 últimos tempos em laboratório para prática.
Explicar os comandos grep, sed, cut, join e awk, sempre explorando suas opções principais e dando exemplos de sua importância para o dia a dia de um administrador de sistemas.
Comentar e explicar os exemplos deste plano de aula.
Solicitar que os alunos façam os exercícios propostos na plicação prática e teórica deste plano de aula.
Recursos Físicos
Laboratório de informática com Linux instalado.
Avaliação
Listar os nomes dos arquivos do diretório “/etc” que contém a palavra profile, independente de conter letras maiúsculas ou minúsculas.
Fazer um script que mostre apenas os nomes dos usuários logados no sistema e a partir de que máquina foi feito o logon. Dica: utilizar o comando w ou who para obter tais informações.
Fazer um script que:
Solicite um nome de usuário
Verifique se o usuário já existe no sistema. Caso exista, informe e aborte a execução.
Solicite o nome completo do usuário.
Solicite o email do usuário.
Cadastre o usuário no sistema.
Envie uma mensagem automatizada e personalizada ao usuário informando de seu cadastramento (utilize para isto os programas sed e mail)
Considerações Adicionais
Plano de Aula: Programação avançada 5
PROGRAMAÇÃO PARA SERVIDORES
Título
Programação avançada 5
Número de Aulas por Semana
Número de Semana de Aula
12 
Tema
Trabalhando com arquivos
Objetivos
Aprender a localizar arquivos no sistema
Aprender a manipular horários de acessos a arquivos
Aprender a trabalhar com arquivos temporários
Estrutura do Conteúdo
1. Listando arquivos
Uma forma simples de listas arquivos é por intermédio do comando echo. O shell expande os curingas e o echo os exibe em uma lista separada por espaço, sem interpretar argumentos.
O comando ls por sua vez sabe que seus argumentos devem ser arquivos. Outra diferença, é que o ls ajusta sua exibição de acordo com a largura da janela, arrumando a saída em colunas. Se precisar que a saída seja um arquivo por linha pode-se utilizar uma das formas abaixo para o comando:
ls /bin/*sh | cat
ls -1 /bin/*sh
As principais opções do comando ls são:
-1 ? Dígito um. Força a saída em uma coluna.
-a ? Mostra todos os arquivos, incluindo arquivos ocultos.
-d ? Mostra informações sobre o próprio diretório em vez de mostrar os arquivos que ele contém.
-F ? Marca determinados tipos de arquivos com sufixo de caracteres especiais.
-g ? Mostra somente informações do grupo, omitindo do usuário.
-h ? Converte a saída para um formato mais fácil de ser entendido por humanos.
-i ? Lista números de inodes.
-l ? L minúsculo. Mostra listagem na forma longa (tipo, proteção, dono, grupo, tamanho, última modificação e nome).
-r ?

Outros materiais