Shell Script (Capítulo IV)
Neste capítulo vamos estudar sobre
curingas (Meta-Caracteres),
redirecionamentos e pipe e no final iremos conhecer alguns comandos do Shell. Antes de iniciar, vamos mostrar os caracteres especiais usados no Shell.
Caracteres Especiais:Os seguintes caracteres são considerados especiais:
? \ . [ ] ^ $Note que o sinal de
$ perde seu sentido se tiver caracteres depois dele, do mesmo jeito que o sinal
^ perde seu sentido se tiver caracteres antes dele. Os colchetes
[ ] comportam-se um pouco diferente. Abaixo segue as regras para eles:
a.) O colchete direito (
] ) perde seu sentido especial se colocado no começo de uma lista, por exemplo:
"[]12]" casa com
] , 1, ou 2.
b.) Um hífen perde seu significado especial se colocado por último. Assim,
[15-] casa com 1, 5 ou -
c.) O caracter
^ perde seu sentido se não for colocado em primeiro lugar.
d.) A maioria dos caracteres especiais perdem seu significado especial se forem colocados dentro de colchetes.
Curingas (meta-caracteres):Os curingas ou meta-caracteres são recursos usados para especificar um ou mais arquivos ou diretórios do sistema uma única vez. Este recurso permite que se faça filtragens que será listado, copiado, etc. No Shell do Linux são utilizados 4 tipos de meta-caracteres:
- "*" - Faz referência a um nome completo/restante de um arquivo/diretório.
- "?" - Faz referência a uma letra numa posição.
[padrão] - Faz referência a uma faixa de caracteres de um arquivo/diretório. Padrão pode ser:
- [a-z][0-9] - Faz referência a caracteres de a até z seguido de um caracter de 0 até 9.
- [a,z][1,0] - Faz a referência aos caracteres a e z seguido de um caracter 1 ou 0 naquela posição.
- [a-z,1,0] - Faz referência a intervalo de caracteres de a até z ou 1 ou 0 naquela posição.
Os caracteres são
"Case Sensitive", se você desejar localizar todos os caracteres alfabéticos, deve usar [a-z ou A-Z].
Se a expressão for precedida por um
^, faz referência a qualquer caracter exceto o da expressão. Por exemplo
[^abc] faz referência a qualquer caracter exceto
a,
b e
c.
[padrões} - Expande e gera strings para pesquisa de padrões de um arquivo/diretório.
- X{ab,01} - Faz referência a seqüencia de caracteres Xab ou X01
- X{a-z,10} - Faz referência a seqüencia de caracteres Xa-z e X10.
O que diferencia este método dos outros é que a existência do arquivo/diretório é opcional para geração do resultado. Isto é útil para a criação de diretórios.
Lembrando que os 4 tipos de curingas (
"*",
"?",
"[]",
"{}") podem ser usados juntos. Para entender melhor vamos a prática:
Em um diretório nós temos 5 arquivo:
suse1.txt,
suse2.txt,
suse3.txt,
suse4.tmp e
suse5.tmp.
Poderíamos usar o meta-caracter
"*" para especificar todos os arquivos no diretório, mas o comando
ls sem o meta-caracter teríamos o mesmo efeito, porém, se desejássemos listar todos os arquivos que tenham somente a extensão
.tmp usaríamos alguns desses métodos:
1.) Usando o comando
ls *.tmp que pega todos os arquivos que começam com qualquer nome e terminam com .tmp;
2.) Usando o comando
ls suse?.tmp, que pega todos os arquivos que começam com o nome suse, tenham qualquer caracter no lugar do meta-caracter
? e terminem com .tmp. Com o exemplo acima suse*.tmp também faria a mesma coisa, mas se também tivéssemos um arquivo chamado suse_backup.tmp este também seria listado.
3.) Usando o comando
ls suse[1-5].tmp, que pega todos os arquivos que começam com o nome suse, tenham qualquer caracter entre o número 1-5 no lugar da 5a letra e terminem com .tmp. Neste caso se obtém uma filtragem mais exata, pois o meta-caracter
? especifica qualquer caracter naquela posição e
[] especifica números, letras ou intervalo que será usado.
E para listar só (suse1.txt), (suse2.txt) e (suse3.txt) podemos usar os seguintes métodos:
1.) ls *.txt que lista todos os arquivos que terminam com .txt
2.) ls suse?.txt que lista todos os arquivos que começam com suse, contenham qualquer caracter na posição do meta-caracter
? e terminem com .txt.
3.) ls suse[1-3].* que lista todos os arquivos que começam com suse contenham números de 1 a 3 naquela posição e terminem com qualquer extensão.
Pode existem outras maneiras de se fazer a mesma coisa, cada um faz como achar melhor. Coloquei exemplos aqui para informar como fazer numa única só vez. O uso de meta-caracteres (curingas) será útil ao copiar arquivos, apagar, mover, renomear, e nas mais diversas partes do sistema. Um outro exemplo importante do uso de meta-caracteres, se quiséssemos entrar em um sub-diretório chamado MeuNovoDiretório, você poderia entrar com o seguinte comando:
cd Meu*, o Shell vai expandir o Meu* para MeuNovoDiretório (sendo a única opção válida) e em seguida o comando é executado passando a entrar neste diretório.
O Shell do Linux permite escolher com liberdade de fazer em maneiras diferentes tendo o mesmo efeito.
Vamos falar agora de redirecionamentos e pipe (
">",
>>,
<,
<< e
|).
Muitos comandos do Shell tem uma entrada, uma saída e pode apresentar erros. A entrada padrão é o teclado (stdin) dentro do terminal. Já a saída (stdout) é o que você visualiza, ou a tela de dentro do terminal. As mensagens de erros (stderr) também podem usar a tela para informar o que ocorreu de errado.
Antes de seguir com os exemplos, é necessário aprender mais sobre cada um dos símbolos de redirecionamentos.
1.) O símbolo
">" redireciona a saída de um programa, comando ou script para algum dispositivo ou arquivo ao invés do dispositivo de saída padrão (tela). Quando é usado com arquivos, este redirecionamento cria ou substitui o conteúdo do arquivo.
2.) O símbolo
">>" redireciona a saída de um programa, comando ou script para algum dispositivo ou final de arquivo ao invés do dispositivo de saída padrão (tela). A diferença entre este redirecionamento duplo e o simples, é que se caso for usado com arquivos, adiciona a saída do comando ao final do arquivo existente ao invés de substituir seu conteúdo.
3.) O símbolo
"<" direciona a entrada padrão de arquivo e dispositivo para um comando. Este comando faz o contrário do anterior, ele envia dados ao comando.
4.) O símbolo
"<<" serve principalmente para marcar o fim de exibição de um bloco. Este é especialmente usado em conjunto com o comando
cat, cito um exemplo para você entender pois realmente o compreendimento é esquisito. É necessário que você siga o exemplo no terminal para compreender na prática:
dê o comando:
cat << MostraTextoVeja que após entrar o comando, será apresentado na tela (logo abaixo) o sinal de prompt esperando que você digite qualquer texto.
Escreva qualquer texto, linha após linha, quando você quiser terminar, na última linha você escreve:
MostraTextoQuando você pressionar a tecla ENTER, o Shell vai apresentar na tela o que você acabou de digitar nas linhas acima do texto
MostraTexto. E o Shell retorna para o prompt esperando pelo próximo comando.
Veja que não tem nenhuma utilidade agora, nos capítulos posteriores, quando estivermos começando a criar arquivos de scripts, isto será necessário para quando o script solicitar que seja digitado um nome de usuário, o script alocar o mesmo em uma variável para ser exibido na tela, etc...
5.) O símbolo
"|" Envia a saída de um comando para a entrada do próximo comando para dar continuidade ao processamento. Os dados enviados são processados pelo próximo comando que mostrará o resultado do processamento. O pipe (traduzindo, significa "tubo", uma vez que ele canaliza a saída para um outro comando).
Para explicar melhor o pipe, é necessário conhecermos 3 comandos do Shell, são eles:
who,
wc e
echo, o comando
who informa uma lista de usuários conectados ao computador.
O comando
wc mostra a quantidade de linhas, palavras, e bytes. E, se o comando
wc estiver sendo usado junto com a opção
-l, mostra somente a quantidade de linhas do arquivo.
O comando
echo exibe mensagens na tela.
Faça na prática seguindo o processo abaixo para entender melhor o uso do pipe:
echo Seu computador tem `who | wc -l` usuário"(s)" conectado"(s)"ou
echo Seu computador tem `who | wc -l` usuário\(s\) conectado\(s\)As aspas dupla
" ou a barra invertida
\ diz ao Shell que os caracteres
( ) são textos. Já o caracter
` (este é o acento crase) é usado para isolar os comandos usados dentro do
echo. Se não tivesse, o Shell iria interpretar
who | wc -l como se fosse texto também.
É aconselhado fortemente a sempre usar aspas, mesmo se não usar espaços em brancos. Pode fazer com que você tenha dor de cabeça quando uma expressão ou comando não funcionar simplesmente por não estarem entre aspas.
Viu só como o Shell é legal? Quando estivermos estudando o arquivos com
Script vai poder fazer utilitário para usar no seu dia-a-dia.
Só falta agora ver sobre o
stderr, a saída de erros. Como vimos, além da saída padrão (que pode ser um arquivo ou também na tela) temos a saída de erro que é apresentado na tela, que são erros encontrados pelo programa durante a sua execução que devem ser exibidos ao usuário.
Como "pegar" uma mensagem de erro numa linha de comando? É simples, apenas devemos indicar o
"file descriptor" (fd) delas. Não vou entrar em detalhes sobre o que é
"descritor de arquivos", apenas temos que saber que o
fd 1 corresponde a saída padrão e o
fd 2 a saída de erro. Assim, para enviar os erros para um arquivo chamado
erros.txt e a saída padrão para o arquivo
suse.txt, usaríamos como exemplo (usando o comando find):
find / -name "*.tar" 1> suse.txt 2> erros.txtOu seja, é só por o número da saída desejada antes do sinal de
">".
Obs.:Como ainda não vimos o comando
find, vamos informar que este comando procura por arquivos/diretórios no disco, ele pode procurar pela data de modificação, por tamanho, etc, usando suas opções.
Mais alguns comandos básicos do Shell e seus significados para você se familiarizar:
1.) clear -> Limpa a tela e coloca o cursor no canto superior esquerdo da tela;
2.) date -> Permite ver/modificar a data e hora do sistema (é necessário estar no modo superusuário para mudar a data/hora, se for somente para visualizar não precisa entrar no superusuário);
3.) df -> Mostra o espaço livre/ocupado de cada partição;
4.) ln -> Cria links para arquivos e diretórios no sistema. O link é um mecanismo que faz referência a outro arquivo ou diretório em uma outra localização.
opções do ln-sCria um link simbólico. Usado para criar ligações com arquivo/diretório de destino (têm uma função parecida com os atalhos do Windows, eles apontam para um arquivo, mas se o arquivo é movido para outro diretório o link fica quebrado).
-vMostra o nome de cada arquivo antes de fazer o link (usado muito quando um instalador está criando um determinado link e vai apresentando o nome do arquivo na tela).
-dCria um hard link para arquivos. Somente o superusuário pode usar esta opção (os hard links são mais intimamente ligados ao arquivo e são alterados junto com ele. Se o arquivo muda de lugar, o link é automaticamente atualizado).
O problema dos hard links é que eles têm duas limitações importantes:O arquivo e o hard link que aponta prá ele devem obrigatoriamente estar localizados no mesmo sistema de arquivos já que o hard link aponta para um endereço físico inode (inode é o endereço físico do seu disco) e não se pode garantir que estes endereços sejam únicos em vários sistemas de arquivos. Suponha, por exemplo, um arquivo localizado no inode 50 no sistema de arquivos hda3. Não se pode garantir que em outro sistema de arquivos, hda5 por exemplo, não haja um outro arquivo com número de inode 50.
A outra limitação é que um hard link não pode apontar para um diretório. Hard links não ocupam espaço no sistema de arquivos.
5.) uptime -> Mostra o tempo de execução do sistema desde que o computador foi ligado;
6.) dmesg -> Mostra as mensagens de inicialização do Kernel. São mostradas as mensagens da última inicialização do sistema.
Como o capítulo desta semana foi um pouco grande, não farei exercícios, fica por sua conta lêr, praticar (lembre-se de usar o terminal como usuário comum) no terminal o que se viu neste capítulo. É bom você fazer repetições durante a semana, dia após dia. Caso tiver uma dúvida envie uma
MP para mim ou para outro moderador caso eu não estiver disponível.
Até o próximo capítulo.
Assuntos que ainda não foram estudados não serão respondidos, se caso você necessitar ajuda sobre algum assunto de
script do qual ainda não falamos, você deve colocar sua pergunta no fórum como qualquer outra pergunta.
A sequência padrão será de um capítulo por semana ou segundo o meu tempo