Linux: Estudo de Casos Em Ciências da Terra Prof. George Sand  Monitor: Débora Matos Curso de Extensão: 2010
Programa (25/01) (14:00 as 17:30) Linux – Conceitos básicos (26/01) (14:00 as 17:30) Linux – Introdução aos scripts.  (27/01) (14:00 as 17:30)  Seismic  Analysis  Code  – Conceitos básicos  (28/01) (14:00 as 17:30)SAC – Macros e geração de imagens
Aula 1: Conceitos Básicos do Linux O Linux é um sistema operacional multi-tarefa e multi-usuário, o que significa que muitas pessoas podem rodar aplicações diferentes em um computador ao mesmo tempo. Para se identificar, você deve “logar” no sistema. LOGIN e SENHA! Para o nosso curso o seu o login e a senha é aula login:training password: obsis123
Vamos começar! Clique duas vezes no ícone Terminal. OBS: Linux considera a diferença entre a letra maiúscula e minúscula. Manipulação de Diretórios ls [opções] [caminho/arquivo] opções  -a   lista todos os arquivos de um diretório - l    lista as permissões, data de modificações, donos,...etc - F    Insere um caractere após o arquivo executáveis (‘*’), diretórios(‘/’),.... - r    Inverte a seqüência da ordenação - X    ordena pela extensão Exemplo: ls   lista os arquivos do diretório atual. ls /bin /sbin   lista os arquivos do diretório /bin/sbin. ls –la /bin   listagem detalhada e completa dos arquivos do  diretório /bin. EXERCÍCIO: Teste outras opções e veja o que realmente mostra (use o seu diretório e o /bin).
O comando cd e pwd cd [diretório] Mudar o diretório de trabalho atual. “ .” Se refere ao diretório corrente, “..” ao diretório inferior, e “~” é o diretório padrão do usuário. pwd  Mostra o caminho do diretório atual Exemplos cd /   muda para o diretório raiz. cd /etc  muda para o diretório /etc. cd -   retorna ao diretório anteriormente acessado pwd   EXERCÍCIO: Após cada comando acima digite pwd e veja o caminho.  Qual o comando que leva você para o diretório /usr/local e depois retorna para o seu diretório
Comando mkdir e rmdir mkdir [opções] [caminho/diretório] Cria um novo diretório rmdir [caminho/diretório]  Remove os diretórios O diretório a ser removido deve estar vazio e você deve ter permissão para removê-lo.  Exemplo mkdir /home/training/teste  cria o diretório teste em /home/aula mkdir teste1 teste2  cria os diretórios teste1 e teste2.  rmdir /home/training/teste  remove o diretório teste em /home/aula. EXERCÍCIO Crie um diretório com seu nome e mude para esse diretório. Mostre o caminho. Remova os diretórios teste1 e teste2
Manipulação do arquivos rm e cp rm [opções] [caminho/diretório] Remove os arquivos - i    confirma antes de remover. - f    remove os arquivos sem confirmação - r    Usado para remover arquivos em sub-diretórios. cp [opções] [origem] [destino] Copia arquivos - f , –i, -r    tem o mesmo significado do rm. -u    copia somente se o arquivo de origem é mais novo que o arquivo de destino ou quando o arquivo de destino não existe. Exemplos: echo ‘teste’ > lixo.txt   Não se preocupe com isso agora echo ‘teste’ > lixo1.txt rm lixo.txt   Remove o arquivo lixo.txt do diretório atual. rm *.txt  Remove todos os arquivos que terminam com txt. echo ‘teste’ > lixo.txt cp lixo.txt lixo1.txt  copia o arquivo lixo.txt para lixo1.txt. cp lixo.txt /tmp  copia o arquivo lixo.txt para o diretório tmp. Exercícios Remova o arquivo lixo.txt do diretório /tmp, copie o arquivo lixo1.txt para /tmp e liste o diretório tmp. Qual o comando para confirmar  copia antes de substituir o arquivo lixo1.txt?
Comandos mv mv [opções] [origem] [destino] Renomeia ou move arquivos e diretórios Semelhante ao comando  cp  mas o arquivo de origem é apagado após o término da cópia. -f    substituir o arquivo sem perguntar  -i    Pergunta antes de substituir. -u    move somente arquivos novos Exemplo mv lixo.txt lixo1.txt   muda o nome do arquivo lixo.txt lixo1.txt   mv lixo1.txt /tmp   move o arquivo lixo1.txt do diretório atual para /tmp. EXERCÍCIO mover o lixo1.txt do diretório /tmp para o diretório atual.
Comandos cat e more cat [opções] [diretório/arquivos1]... [diretório/arquivos] Usando para concatenar arquivos, mas também usado para mostrar o conteúdo completo de um arquivo por vez. -n    mostra o número das linhas enquanto o conteúdo é mostrado. more [arquivo] Permite fazer a paginação de arquivos.  Para sair pressione  q Exemplo echo ‘lixo’ > lixo.txt echo ‘lixo2’ >> lixo.txt cat lixo.txt more lixo.txt cat /etc/passwd | more Exercício Crie os arquivos lixo1.txt e lixo.txt (pg 7) e concatene em novo lixo2.txt.  cat lixo1.txt lixo.txt  cat lixo1.txt lixo.txt > lixo2.txt
Camandos head e tail  head [opções] [arquivo] Mostre as linhas iniciais de um arquivo texto. - c    mostra o número de bytes do início do arquivo. - [numero]    mostra o número de linhas do início do arquivo. Caso não seja especificado, mostra as 10 primeiras linhas. tail [opções] [arquivo] Mostra as linhas finais de um arquivo texto. -c e – [número] Exemplo head /etc/passwd head -20 /etc/passwd tail /etc/passwd tail -20 /etc/passwd history | head -15 history | tail -15 Exercício Qual a diferença entre tail, more e head.
Comando wc e sort wc [opções] [arquivo] Conta o número de palavras, bytes e linhas em um arquivo.  -c    mostra os bytes -w    mostra a quantidade de palavras -l    mostra a quantidade de linhas sort [opções] [arquivo] -b    ignora linhas em branco -d    Somente usa letras, dígitos e espaços durante a organização -f    ignora a diferença entre maiúsculas e minúsculas. -n    números serão organizados em ordem aritmética -c    Verifica se o arquivo está organizado.  - t caractere    Usa caractare como delimitador durante a organização de linhas +num1 –num2    Especifica qual o campo dentro da linha que será usado na organização.  Exemplo wc /etc/passwd  mostra linhas, palavras e letras wc –w /etc/passwd  mostra a quantidade de palavras. sort /etc/passwd  organiza em ordem crescente sort –r  /etc/passwd  organiza em ordem decrescente sort –f /etc/passwd  ignora diferenças entre maiúsculas e minúsculas.  sort +1 -3 /etc/passwd  organiza o passwd usando como referência a segunda  até quarta palavra. EXERCÍCIO Qual comando acima é o mesmo que  cat /etc/passwd | sort  ?
Comando Diff Diff [diretório/arquivo1] [diretório/arquivo2] [opções] Compara dois arquivos e mostra as diferenças entre eles. - a    compara como arquivo texto - b    ignora espaços em branco como diferenças -B    ignora linhas brancas inseridas ou apagadas nos arquivos -I    ignora diferença entre maiúsculas e minúsculas. - q    Mostra somente se os dois arquivos possuem diferenças. - r    compara sub-diretórios existentes. - s [nome]     inicia a comparação de diretórios pelo arquivo [nome].  Exemplo diff lixo.txt /etc/passwd  compara o arquivo lixo.txt com o arquivo passwd diff –r /usr/src/linux-headers-2.6.17-10 /usr/src/linux-headers-2.6.17-10-generic > patch.2.6.16.diff  compara o diretório e sub-diretórios linux-2.6 e grava as dferenças entre eles no arquivo patch.2.6.16.diff EXERCÍCIO Mostre na tela o arquivo patch.2.6.16.diff e compare com o arquivo /etc/passwd
Permissão de arquivos Linux permite que arquivos sejam compartilhados entre usuários e grupos de usuários.  Cada arquivo pertence a um usuário particular. Entretanto, arquivo pertence a um grupo, que definido de usuários do sistema. Cada usuário é colocado em pelo menos um grupo quando sua conta é criada. Permissões são definidas em três tipos: leitura(r), escrita(w) e execução(x).  Essas permissões podem ser concedidas a três tipos de usuários: dono do arquivo, o grupo ao qual o arquivo pertence, e a todos usuários.  ls –l  drwxr-xr--  12 aluno1  users  4096 2006-12-05 15:23 aluno1 -rwxr-xr--  12 marina  users  4096 2006-11-08 17:12 aluno2 1º. Caracter  representa o tipo de arquivo “-” representa arquivo comum e “d” diretório. Os próximos três caracteres (“rwx”) representam as permissões concedidas ao dono do arquivo, aluno1 ou marina.  Os próximos três caracteres (“r-x”) representam as permissões do grupo. O usuário pertencente ao grupo poderá ler e executar o arquivo. Os próximos três caracteres (“r—”) representam as permissões para qualquer usuário do sistema. Outros usuários podem ler o arquivo, mas não escrever ou executar. EXERCÍCIO Descreva que tipo permissão é essa –rw--wx---?
Modificando as permissões chmod {a,u,g,o}{+,-}{r,w,x}arquivos  As primeiras letras indicam a quem você está concedendo ou retirando permissões a    “all” u    usuário g    grupos o    outros Depois especifique se está adicionando (+) ou retirando(-) direitos. E por fim, especifique o tipo de permissão: leitura ( r ead), escrita( w rite) e execução (e x ecute). Exemplo ls –l lixo.txt chmod a+r lixo.txt  Dá permissão de leituras para todos usuários chmod +r lixo.txt  é a mesma coisa. chmod og-x  lixo.txt  remove permissão de execução de usuários que não o próprio dono. EXERCÍCIO Permita que o dono leia, escreva e execute o arquivo lixo.txt Remova as permissões de leitura para outros usuários que não sejam o dono ou usuários do grupo para o arquivo lixo.txt
Comando de Busca grep [expressão] [arquivo] [opções] - A [número]    mostra o número de linhas após a linha encontrada pelo grep - B [número]    mostra o número de linhas antes a linha encontrada pelo grep - f [arquivo]    Especifica que o texto que será localizado está no arquivo. - i    ignora a diferença entre maiúscula e minúscula.  - n     mostra o nome de cada linha encontrada pelo grep -U    trata o arquivo que será tratado como binário. Exemplo grep “data” /etc/passwd  ps  –aux | grep inetd  grep “data” /etc/passwd  -A12 –B15 grep  -n “sh” /etc/passwd Exercício Qual a linha está o texto /bin/ no arquivo /etc/passwd?
Redirecionamentos e pipes stdin    entrada padrão ( standard input ) stdout    saída padrão (standard out) Quando não especifica o arquivo, por exemplo; o comando cat, vai ler dados stdin e mandar dados para stdout .  Exemplo cat   Olá Olá Bye Bye  {ctrl-D} Agora você quer mudar a saída do  sort para um arquivo, para gravar sua lista de compras no disco. A saída padrão é direcionada usando o simbolo”>”  sort > lista_de_eventos Norte do Peru João Câmara Faixa Tocantins {ctrl-D} cat lista_de_eventos Saida  não-destrutiva Exemplo cat >> lista_de_eventos Plataforma San Juan Santiago Del Estero {ctrl-D}
Use o pipe  ls > lista sort –r lista   Gravou a saída do ls num arquivo lista, e então executou “sort –r”. Esse arquivo temporário não será usado. Existe outra maneira de fazer isso? PIPES (|), o stdout do primeiro comando é enviada para o stdin do segundo comando. No caso acima, queremos mandar o stdout do ls para o stdin do sort.  ls | sort –r EXERCÍCIO Mostre a saída de uma lista de arquivos em /usr/bin, onde você poderá paginar.  Use mais pipes    adicione o comando “tail -1” no exemplo “ls | sort –r” e veja o que acontece
Tarefa em segundo plano, abortando tarefas, parando tarefas.   yes > lixo Esse processo continua infinitamente. Para matar o processo clique a tecla (Ctrl-C).  head lixo  Para colocar o processo em segundo plano é necessário usar o caractere “&”. gedit lixo & [1] 25273 jobs [1] + Running yes > lixo  O processo yes está rodando em segundo plano. Para matar a tarefa, use o comando kill e use como argumento um dos número acima. kill %1  ou  kill 25273 Jobs  PARANDO TAREFAS gedit lixo {ctrl-Z} [1] + gedit lixo   > lixo Crtl-Z pára temporariamente até que você reinicie. Para reiniciar use o comando “fg” ( foreground ) fg   A tarefa volta para o primeiro plano, Pare a tarefa novamente com ctrl-Z e use o comando bg para colocar a tarefa em segundo plano {ctrl-z} bg   [1] + yes > lixo.
Editores Existem diversos editores vi (editor) emacs(editor) Open Office  nedit (editor) gedit – Vamos usar esse no curso gedit lixo &
Introdução ao comando awk O nome é derivado das iniciais de seus três criadores, Aho, Kernighan, e Weinberger. Funciona com pipes ou diretamente com arquivos.  Sua importância se for necessário fazer frequentemente alterações em vários arquivos texto, onde quer que seja que certos padrões apareçam; se for necessário extrair dados de algumas linhas de um arquivo enquanto o resto é descartado. Ou seja, com awk é possível gerenciar tarefas simples de "reformatar dados" com apenas algumas linhas de código.  Com awk é possível: gerenciar pequenos banco de dados pessoais; gerar relatórios; validar dados; produzir índices, e fazer outras tarefas de preparação de documentos; fazer experimentos com algoritmos que podem ser adaptados posteriormente a outras linguagens de programação.     awk [ação] [Programa]  [Arq1Entrada] [Arq2Entrada]
Vamos começar awk Use o comando cat para criar o arquivo terremoto.txt 2007/07/31 21:09:20.9000  -3.024  36.423  10 4.7 MB QED TANZANIA 2007/07/31 19:38:33.5000 -13.862  170.494 635 4.6 MB QED VANUATU ISLANDS 2007/07/31 15:07:36.1000  27.336  126.852  16 5.7 MS QED RYUKYU ISLAND 2007/07/31 12:58:29.1000  28.227  138.979 509 5.2 MB QED BONIN ISLANDS  2007/07/30 23:37:50.3000 -17.262 -178.777 560 5.1 MB QED FIJI ISLANDS 2007/07/30 10:38:37.6000  1.998  97.946  30 4.9 MB QED SUMATRA 2007/07/30 06:20:34.6000  46.857  152.623  10 4.8 MB QED KURIL ISLANDS ----------------------------------- Agora faça cada comando e veja o resultado.  awk ‘/MB/’ terremoto.txt    mostra somente as linhas que contem o texto MB awk ‘{print $3, $4}’ terremoto.txt    mostra o campo 3 e 4 do arquivo terremoto.txt awk ‘/MB/ {print $3, $4}’ terremoto.txt    O que esse comando faz?  awk ‘/S/’ terremoto.txt     mostra as linhas que contem o caractere S awk ‘$1 ~ /1/’ terremoto.txt     o operador ~ mostra todas as linhas que contem o número 1 no primeiro campo awk ‘$6 == 4.6 {print $2, $1, $6}’  terremoto.txt     compara o número do sexto campo com valor 4.6.
awk ‘$5 <= 100’ terremoto ____________________________ o operador &&  -- “e” duas o mais condições. awk ‘$5 >= 500 && $5 <600’ terremoto O operador “,” seleciona o grupo de linhas.  awk ‘/TANZANIA/,/SUMATRA/’ terremoto.txt Use o gedit para criar o arquivo pre_inicio com o texto  BEGIN {print “Data  hora  Lat  Lon  Prof  Mag Regiao”} {print} Para inserir comandos em arquivo usa-se a opção –f antes do nome contendo o programa em awk. Usando BEGIN . O programa pre_inicio   usa BEGIN para inseri cabeçario. awk –f pre_inicio terremoto Função length sem argumento mostra o número de caracteres na linha, incluindo os espaços. A variável $0 imprime toda a linha.  awk ‘{print length, $0}’ terremoto | sort NR – referente o número de linha NF – referente o número de campos FS – insere um espaço RS – insere uma nova linha EXERCÍCIO Veja o que o comando awk ‘length > 40 {print NR}’ terremoto Mostre do arquivo somente as linhas três quatro e cinco do arquivo terremoto.
END    similar ao BEGIN awk ‘END {print NR, “eventos.”}’ terremoto Usando o comando “if” para mudar o tipo de magnitude.  Edite o programa awk     altera_mag (use gedit ou cat) { if ($7 ~ /MB/) $7 = “MS” if ($7 ~ /MS/) $7 = “MB” print } awk –f altera_mag terremoto
Printf (awk) Controla a saída do print de acordo com formato.  printf “formato do caractere” arg1, arg2,...,argn. \n    nova linha  \t     [-][-x.[y]]conv x é extensão mínima do campo, e o .y o número de caracteres a direita do ponto decimal. Conv é a letra que especifica o formato. conv d    decimal e     notação científica  f    específica de formato variável s     caracteres. Exemplo:Edite o texto abaixo no arquivo printf_demo BEGIN {print “Data  hora  Lat  Lon  Prof  Mag Regiao”} {print \  “ ----------------------------------------------------------------------”} { if ($7 ~ /MB/) $7 = “MS” printf  “%2.1f \t %10s \t %11s \t %8.3f  \t %8.3f  \t %3d magnitude \n”,  $1, $2, $3, $4, $5, $6  } awk –f print_demo terremoto. tab
Até amanhã!
Aula 2: Shell Script Começando!!! Por exemplo, se de tempos em tempos você quer saber informações do sistema como horário, ocupação do disco e os usuários que estão logados, é preciso digitar três comandos: date df w É melhor fazer um script chamado &quot;sistema&quot; e colocar estes comandos nele. O conteúdo do arquivo &quot;sistema&quot; seria o seguinte: #!/bin/bash date df w E para chamar este script, basta agora executar apenas um comando: ./sistema  (não esqueça do comando “chmod”, veja se está executável, se torne-o) Isso é um  Shell Script . Um arquivo de texto que contém comandos do sistema e pode ser executado pelo usuário
Primeiro Shell Script Escolher um nome para o script Já temos um nome: sistema. Use apenas letras minúsculas e evite acentos, símbolos e espaço em branco Escolher o diretório onde colocar o script Para que o script possa ser executado de qualquer parte do sistema, mova−o para um diretório que esteja no seu PATH.  O que o PATH? É o local onde está todos os arquivos executáveis. cat > .bashrc export PATH=$PATH:/home/aula/bin.    /usr/local/sac/bin {ctrl-d} source .bashrc Crie no seu HOME o diretório bin  e dentro do diretório bin mova o arquivo sistema  echo $PATH Colocar a chamada do Shell na primeira linha -  A primeira linha do script deve ser: #!/bin/bash Para que ao ser executado, o sistema saiba que é o Shell quem irá interpretar estes comandos. Tornar o script um arquivo executável Use o seguinte comando para que seu script seja reconhecido pelo sistema como um comando executável:
Melhorando Shell Script Executar os três comandos seguidos resulta num bolo de texto na tela, misturando as  informações e dificultando o entendimento.  O comando &quot;echo&quot; serve para mostrar mensagens na tela. Que tal anunciar cada comando antes de executá-lo? #!/bin/bash  (Vc poderá usar #!/bin/csh) echo &quot;Data e Horário:&quot; date echo echo &quot;Uso do disco:&quot; df echo echo &quot;Usuarios conectados:&quot; w Para usar o echo, basta colocar o texto entre &quot;aspas&quot;. Se nenhum texto for colocado, uma linha em branco mostrada.
Interagir com o Usuário Para o script ficar mais completo, vamos colocar uma interação mínima com o usuário, pedindo uma confirmação antes de executar os comandos. O comando &quot;read&quot; leu o que o usuário digitou e guardou na variável RESPOSTA. Logo em seguida, o comando &quot;test&quot; checou se o conteúdo dessa variável era &quot;n&quot;. Se afirmativo, o comando &quot;exit&quot; foi chamado e o script foi finalizado. Nessa linha há vários detalhes importantes: O conteúdo da variável é acessado colocando−se um cifrão &quot;$&quot; na frente O comando test é muito útil para fazer vários tipos de checagens em textos e arquivos O operador lógico E &quot;&&&quot;, só executa o segundo comando caso o primeiro tenha sido OK. O operador OU é o &quot;||&quot; #!/bin/bash echo &quot;Vou buscar os dados do sistema. Posso continuar? [sn] &quot; read RESPOSTA test &quot;$RESPOSTA&quot; = &quot;n&quot; && exit echo &quot;Data e Horário:&quot; date echo echo &quot;Uso do disco:&quot; df echo echo &quot;Usuários conectados:&quot; w
Melhorar o Código do Script Com o tempo, o script vai crescer, mais comandos vão ser adicionados e quanto maior, mais difícil encontrar o ponto certo onde fazer a alteração ou corrigir algum erro. Para poupar horas de estresse, e facilitar as manutenções futuras, é preciso deixar o código visualmente mais agradável e espaçado, e colocar comentários esclarecedores. Basta iniciar a linha com um &quot;#&quot; e escrever o texto do comentário em seguida. Estas linhas são ignoradas pelo Shell durante a execução. O cabeçalho com informações sobre o script e seu autor também é importante para se ter uma visão geral do que o script faz, sem precisar decifrar seu código.  Também é possível colocar comentários no meio da linha # como este #!/bin/bash # sistema − script que mostra informações sobre o sistema # Autor: Fulano da Silva # Pede uma confirmação do usuário antes de executar echo &quot;Vou buscar os dados do sistema. Posso continuar? [sn] &quot; read RESPOSTA # Se ele digitou 'n', vamos interromper o script test &quot;$RESPOSTA&quot; = &quot;n&quot; && exit # O date mostra a data e a hora correntes echo &quot;Data e Horário:&quot; date echo # O df mostra as partições e quanto cada uma ocupa no disco echo &quot;Uso do disco:&quot; df echo # O w mostra os usuários que estão conectados nesta máquina echo &quot;Usuários conectados:&quot; w
Fixando conceitos básicos As variáveis são a base de qualquer script. É dentro delas que os dados obtidos durante a execução do script serão armazenados. Para definir uma variável, basta usar o sinal de igual &quot;=&quot; e para ver seu valor, usa−se o &quot;echo&quot;: Não podem haver espaços ao redor do igual &quot;=“ Exemplo: VARIAVEL=&quot;um dois tres“ echo $VARIAVEL um dois tres echo $VARIAVEL $VARIAVEL um dois tres um dois tres Ainda é possível armazenar a saída de um comando dentro de uma variável. Ao invés de aspas, o comando deve ser colocado entre &quot;$(...)&quot;, veja: HOJE=$(date) echo &quot;Hoje é: $HOJE&quot; Hoje é: Sáb Abr 24 18:40:00 BRT 2004 unset HOJE echo $HOJE &quot;unset&quot; apaga uma variável.
O comando test O canivete suíço dos comandos do Shell é o &quot;test&quot;, que consegue fazer vários tipos de checagens, em números, textos e arquivos. Ele possui várias opções para indicar que tipo de teste será feito, algumas delas:
Exemplo e Exercício Em todos as comandos que aceitam condições (ex. if, while) deve ser posto um comando nessa condição, sendo avaliado o valor devolvido por esse comando. if ls &quot;$1&quot; > /dev/null 2>&1; then echo true else echo false fi Se o comando ls devolver true (0) o código relativo ao then é executado, se devolver false (1) é executado o código relativo ao else. o comando test pode ser simplificado na sua escrita para [ e fecha o comando ]. read arq sistema [ -f “$arq” ] &&  echo “$arq é um arquivo” Fazer o script &quot;testa−arquivos&quot;, que pede ao usuário para digitar um arquivo e testa se este arquivo existe. Se sim, diz se é um arquivo ou um diretório.  Exemplo de uso: testa−arquivos Digite o arquivo: /naoexiste O arquivo '/naoexiste' não foi encontrado testa−arquivos Digite o arquivo: /tmp /tmp é um diretório testa−arquivos Digite o arquivo: /etc/passwd /etc/passwd é um arquivo
Resposta testa-arquivos #!/bin/bash echo -n &quot;Digite o arquivo: &quot;; read ARQUIVO [ -d &quot;$ARQUIVO&quot; ] && echo &quot;$ARQUIVO  é um diretorio&quot; [ -f &quot;$ARQUIVO&quot; ] && echo &quot;$ARQUIVO é um arquivo&quot; [ -f &quot;$ARQUIVO&quot; -o -d &quot;$ARQUIVO&quot; ] || echo &quot;O arquivo '$ARQUIVO' nao foi encontrado&quot; echo
Referências Manual do awk  ( http://www.inf.pucrs.br/~manssour/AWK/index.html ) Practical guide to the Unix system - M.K. Sobell Third Edition. Apostila do Aurélio (http://aurelio.net/shell/apostila/)
If, For e While Assim como qualquer outra linguagem de programação, o Shell também tem estruturas para se fazer condicionais e loop. As mais usadas são if, for e while. for  VAR in LISTA  do   comandos done if  COMANDO then   comandos else comandos fi No caso c shell é outro estrutura mais vamos nos fixar no C shell (endif) while do comandos  done
Há um atalho para o test , que é o comando [. Ambos são exatamente o mesmo comando, porém usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens: #!/bin/bash echo &quot;Digite o número: &quot;; read VARIAVEL if [ &quot;$VARIAVEL&quot; −gt 10 ] then echo &quot;é maior que 10&quot; else echo &quot;é menor que 10&quot; fi o if testa um comando e não uma condição. Porém como já conhecemos qual o comando do Shell que testa condições, é só usá−lo em conjunto com o if. Por exemplo, para saber se uma variável é maior ou menor do que 10 e mostrar uma mensagem na tela informando: if test &quot;$VARIAVEL&quot; −gt 10 then echo &quot;é maior que 10&quot; else echo &quot;é menor que 10&quot; fi Condição if
Condição while e for Já o while é um laço que é executado enquanto um comando retorna OK. Usaremos o test (ou o [). Por exemplo, para segurar o processamento do script enquanto um arquivo de  lock  não é removido: while test −f /tmp/lock do sleep 1 done o for percorre uma lista de palavras, pegando uma por vez: for numero in um dois três quatro cinco do echo &quot;Contando: $numero&quot; done
Condição For Uma ferramenta muito útil para usar com o for é o seq, que gera uma seqüência numérica. Para fazer o loop andar 10 passos, pode−se fazer: seq [opções] [primeiro] [incremento] [último]   Primeiro   Número inicial da seqüência.  Incremento     Número utilizado para avançar na seqüência.  Último     Número final da seqüência. opções -f, -Formato de saída dos números da seqüência. Utilize o estilo do printf para ponto flutuante.  -s, Usa [string] para separar a seqüência de números .  -w, zeros na frente dos números mantendo a seqüência alinhada. seq 0 2 10 seq -w 0 10  seq -f%f 0 10 seq -s&quot;, &quot; 0 10   ----------- for passo in $(seq 10) O mesmo passo anterior pode ser feito com o while, usando um contador: i=0 while test $i −le 10 do i=$((i+1)) echo &quot;Contando: $i&quot; done E temos ainda o loop infinito, com condicional de saída usando o &quot;break¨: while : do if test −f /tmp/lock then echo &quot;Aguardando liberação do lock...“ sleep 1 else break fi done
Exercícios Vc também tem que aprender a se virar sozinho! relacao.sh -- > Recebe dois números como parâmetro e mostra a relação entre eles. Exemplo: $  ./relacao.sh 3 5 3 é menor 5 $  ./relacao.sh 5 3 5 é maior 3 $  ./relacao.sh 5 5 5 é igual 5 Reposta #!/bin/sh if [ $1 −eq $2 ] then echo &quot;$1 é igual $2&quot; if [ $1 −lt $2 ] then echo &quot;$1 é menor $2&quot; else  echo &quot;$1 é maior $2&quot; fi _ #!/bin/bash echo “digite o primeiro  numero’ read prim echo ‘digie o segundo numero’ read seg If [ $prim –eq $seg ]; then echo “$prim é igual $seg“ fi If  [ $prim –lt $seg ]; then echo “$prim é menor $seg” fi If [ $prim –gt $seg ]; then  echo “$prim é maior $sef” fi
zerador.sh Recebe um número como parâmetro e o diminui até chegar a zero, mostrando na tela cada passo, numa mesma linha. Exemplo: $  ./zerador.sh 5 5 4 3 2 1 0 $  ./zerador.sh 10 10 9 8 7 6 5 4 3 2 1 0 Resposta #!/bin/bash i=$1 while [ $i −ge 0 ]; do echo −n &quot;$i &quot; i=$((i−1)) done echo
substring.sh Recebe duas palavras como parâmetro e checa se a primeira palavra está contida dentro da segunda. Só mostra mensagem informativa em caso de sucesso, do contrário não mostra nada.  Exemplo: $  ./substring.sh ana banana ana está contida em banana $  ./substring.sh banana maria $  ./substring.sh banana $  ./substring.sh $ Dica: Veja se o comando grep é útil! #!/bin/sh [ $# −ne 2 ] && exit echo $2 | grep −qs $1 && echo &quot;$1 está contida em $2&quot;
juntatudo.sh Mostra na tela &quot;grudados&quot; todos os parâmetros recebidos na linha de comando, como uma única palavra. Exemplo: $  ./juntatudo.sh a b c d e f verde azul abcdefverdeazul Pesquise sobre o comando tr man tr #!/bin/sh echo $* | tr −d ' '
users.sh Do arquivo /etc/passwd, mostra o usuário e o nome completo de cada usuário do sistema (campos 1 e 5) separados por um TAB.  Exemplo: $  ./users.sh ftp FTP User nobody Nobody named Domain name server xfs X Font Server mysql MySQL server aula aula Use os comandos cut e tr #!/bin/sh cat /etc/passwd | cut −d : −f 1,5 | tr : '\t'
shells.sh Do arquivo /etc/passwd, mostra todos os shells (último campo) que os usuários usam. Não mostrar linhas repetidas. Exemplo: $  ./shells.sh /bin/bash /bin/false /bin/sync /sbin/halt /sbin/shutdown Pesquise sobre o comando uniq #!/bin/sh cat /etc/passwd | cut −d : −f 7 | sort | uniq
parametros.sh Mostra na tela todos os parâmetros recebidos na linha de comando, contando−os. Exemplo: $  ./parametros.sh a b c d e f Parâmetro 1: a Parâmetro 2: b Parâmetro 3: c Parâmetro 4: d Parâmetro 5: e Parâmetro 6: f Pesquise sobre o comando shift #!/bin/bash i=0 while [ &quot;$1&quot; ] ; do i=$((i+1)) echo &quot;Parâmetro $i: $1&quot; shift done

SAC - Aula 1

  • 1.
    Linux: Estudo deCasos Em Ciências da Terra Prof. George Sand Monitor: Débora Matos Curso de Extensão: 2010
  • 2.
    Programa (25/01) (14:00as 17:30) Linux – Conceitos básicos (26/01) (14:00 as 17:30) Linux – Introdução aos scripts. (27/01) (14:00 as 17:30) Seismic Analysis Code – Conceitos básicos (28/01) (14:00 as 17:30)SAC – Macros e geração de imagens
  • 3.
    Aula 1: ConceitosBásicos do Linux O Linux é um sistema operacional multi-tarefa e multi-usuário, o que significa que muitas pessoas podem rodar aplicações diferentes em um computador ao mesmo tempo. Para se identificar, você deve “logar” no sistema. LOGIN e SENHA! Para o nosso curso o seu o login e a senha é aula login:training password: obsis123
  • 4.
    Vamos começar! Cliqueduas vezes no ícone Terminal. OBS: Linux considera a diferença entre a letra maiúscula e minúscula. Manipulação de Diretórios ls [opções] [caminho/arquivo] opções -a  lista todos os arquivos de um diretório - l  lista as permissões, data de modificações, donos,...etc - F  Insere um caractere após o arquivo executáveis (‘*’), diretórios(‘/’),.... - r  Inverte a seqüência da ordenação - X  ordena pela extensão Exemplo: ls lista os arquivos do diretório atual. ls /bin /sbin lista os arquivos do diretório /bin/sbin. ls –la /bin listagem detalhada e completa dos arquivos do diretório /bin. EXERCÍCIO: Teste outras opções e veja o que realmente mostra (use o seu diretório e o /bin).
  • 5.
    O comando cde pwd cd [diretório] Mudar o diretório de trabalho atual. “ .” Se refere ao diretório corrente, “..” ao diretório inferior, e “~” é o diretório padrão do usuário. pwd Mostra o caminho do diretório atual Exemplos cd / muda para o diretório raiz. cd /etc muda para o diretório /etc. cd - retorna ao diretório anteriormente acessado pwd EXERCÍCIO: Após cada comando acima digite pwd e veja o caminho. Qual o comando que leva você para o diretório /usr/local e depois retorna para o seu diretório
  • 6.
    Comando mkdir ermdir mkdir [opções] [caminho/diretório] Cria um novo diretório rmdir [caminho/diretório] Remove os diretórios O diretório a ser removido deve estar vazio e você deve ter permissão para removê-lo. Exemplo mkdir /home/training/teste cria o diretório teste em /home/aula mkdir teste1 teste2 cria os diretórios teste1 e teste2. rmdir /home/training/teste remove o diretório teste em /home/aula. EXERCÍCIO Crie um diretório com seu nome e mude para esse diretório. Mostre o caminho. Remova os diretórios teste1 e teste2
  • 7.
    Manipulação do arquivosrm e cp rm [opções] [caminho/diretório] Remove os arquivos - i  confirma antes de remover. - f  remove os arquivos sem confirmação - r  Usado para remover arquivos em sub-diretórios. cp [opções] [origem] [destino] Copia arquivos - f , –i, -r  tem o mesmo significado do rm. -u  copia somente se o arquivo de origem é mais novo que o arquivo de destino ou quando o arquivo de destino não existe. Exemplos: echo ‘teste’ > lixo.txt Não se preocupe com isso agora echo ‘teste’ > lixo1.txt rm lixo.txt Remove o arquivo lixo.txt do diretório atual. rm *.txt Remove todos os arquivos que terminam com txt. echo ‘teste’ > lixo.txt cp lixo.txt lixo1.txt copia o arquivo lixo.txt para lixo1.txt. cp lixo.txt /tmp copia o arquivo lixo.txt para o diretório tmp. Exercícios Remova o arquivo lixo.txt do diretório /tmp, copie o arquivo lixo1.txt para /tmp e liste o diretório tmp. Qual o comando para confirmar copia antes de substituir o arquivo lixo1.txt?
  • 8.
    Comandos mv mv[opções] [origem] [destino] Renomeia ou move arquivos e diretórios Semelhante ao comando cp mas o arquivo de origem é apagado após o término da cópia. -f  substituir o arquivo sem perguntar -i  Pergunta antes de substituir. -u  move somente arquivos novos Exemplo mv lixo.txt lixo1.txt muda o nome do arquivo lixo.txt lixo1.txt mv lixo1.txt /tmp move o arquivo lixo1.txt do diretório atual para /tmp. EXERCÍCIO mover o lixo1.txt do diretório /tmp para o diretório atual.
  • 9.
    Comandos cat emore cat [opções] [diretório/arquivos1]... [diretório/arquivos] Usando para concatenar arquivos, mas também usado para mostrar o conteúdo completo de um arquivo por vez. -n  mostra o número das linhas enquanto o conteúdo é mostrado. more [arquivo] Permite fazer a paginação de arquivos. Para sair pressione q Exemplo echo ‘lixo’ > lixo.txt echo ‘lixo2’ >> lixo.txt cat lixo.txt more lixo.txt cat /etc/passwd | more Exercício Crie os arquivos lixo1.txt e lixo.txt (pg 7) e concatene em novo lixo2.txt. cat lixo1.txt lixo.txt cat lixo1.txt lixo.txt > lixo2.txt
  • 10.
    Camandos head etail head [opções] [arquivo] Mostre as linhas iniciais de um arquivo texto. - c  mostra o número de bytes do início do arquivo. - [numero]  mostra o número de linhas do início do arquivo. Caso não seja especificado, mostra as 10 primeiras linhas. tail [opções] [arquivo] Mostra as linhas finais de um arquivo texto. -c e – [número] Exemplo head /etc/passwd head -20 /etc/passwd tail /etc/passwd tail -20 /etc/passwd history | head -15 history | tail -15 Exercício Qual a diferença entre tail, more e head.
  • 11.
    Comando wc esort wc [opções] [arquivo] Conta o número de palavras, bytes e linhas em um arquivo. -c  mostra os bytes -w  mostra a quantidade de palavras -l  mostra a quantidade de linhas sort [opções] [arquivo] -b  ignora linhas em branco -d  Somente usa letras, dígitos e espaços durante a organização -f  ignora a diferença entre maiúsculas e minúsculas. -n  números serão organizados em ordem aritmética -c  Verifica se o arquivo está organizado. - t caractere  Usa caractare como delimitador durante a organização de linhas +num1 –num2  Especifica qual o campo dentro da linha que será usado na organização. Exemplo wc /etc/passwd mostra linhas, palavras e letras wc –w /etc/passwd mostra a quantidade de palavras. sort /etc/passwd organiza em ordem crescente sort –r /etc/passwd organiza em ordem decrescente sort –f /etc/passwd ignora diferenças entre maiúsculas e minúsculas. sort +1 -3 /etc/passwd organiza o passwd usando como referência a segunda até quarta palavra. EXERCÍCIO Qual comando acima é o mesmo que cat /etc/passwd | sort ?
  • 12.
    Comando Diff Diff[diretório/arquivo1] [diretório/arquivo2] [opções] Compara dois arquivos e mostra as diferenças entre eles. - a  compara como arquivo texto - b  ignora espaços em branco como diferenças -B  ignora linhas brancas inseridas ou apagadas nos arquivos -I  ignora diferença entre maiúsculas e minúsculas. - q  Mostra somente se os dois arquivos possuem diferenças. - r  compara sub-diretórios existentes. - s [nome]  inicia a comparação de diretórios pelo arquivo [nome]. Exemplo diff lixo.txt /etc/passwd compara o arquivo lixo.txt com o arquivo passwd diff –r /usr/src/linux-headers-2.6.17-10 /usr/src/linux-headers-2.6.17-10-generic > patch.2.6.16.diff compara o diretório e sub-diretórios linux-2.6 e grava as dferenças entre eles no arquivo patch.2.6.16.diff EXERCÍCIO Mostre na tela o arquivo patch.2.6.16.diff e compare com o arquivo /etc/passwd
  • 13.
    Permissão de arquivosLinux permite que arquivos sejam compartilhados entre usuários e grupos de usuários. Cada arquivo pertence a um usuário particular. Entretanto, arquivo pertence a um grupo, que definido de usuários do sistema. Cada usuário é colocado em pelo menos um grupo quando sua conta é criada. Permissões são definidas em três tipos: leitura(r), escrita(w) e execução(x). Essas permissões podem ser concedidas a três tipos de usuários: dono do arquivo, o grupo ao qual o arquivo pertence, e a todos usuários. ls –l drwxr-xr-- 12 aluno1 users 4096 2006-12-05 15:23 aluno1 -rwxr-xr-- 12 marina users 4096 2006-11-08 17:12 aluno2 1º. Caracter representa o tipo de arquivo “-” representa arquivo comum e “d” diretório. Os próximos três caracteres (“rwx”) representam as permissões concedidas ao dono do arquivo, aluno1 ou marina. Os próximos três caracteres (“r-x”) representam as permissões do grupo. O usuário pertencente ao grupo poderá ler e executar o arquivo. Os próximos três caracteres (“r—”) representam as permissões para qualquer usuário do sistema. Outros usuários podem ler o arquivo, mas não escrever ou executar. EXERCÍCIO Descreva que tipo permissão é essa –rw--wx---?
  • 14.
    Modificando as permissõeschmod {a,u,g,o}{+,-}{r,w,x}arquivos As primeiras letras indicam a quem você está concedendo ou retirando permissões a  “all” u  usuário g  grupos o  outros Depois especifique se está adicionando (+) ou retirando(-) direitos. E por fim, especifique o tipo de permissão: leitura ( r ead), escrita( w rite) e execução (e x ecute). Exemplo ls –l lixo.txt chmod a+r lixo.txt Dá permissão de leituras para todos usuários chmod +r lixo.txt é a mesma coisa. chmod og-x lixo.txt remove permissão de execução de usuários que não o próprio dono. EXERCÍCIO Permita que o dono leia, escreva e execute o arquivo lixo.txt Remova as permissões de leitura para outros usuários que não sejam o dono ou usuários do grupo para o arquivo lixo.txt
  • 15.
    Comando de Buscagrep [expressão] [arquivo] [opções] - A [número]  mostra o número de linhas após a linha encontrada pelo grep - B [número]  mostra o número de linhas antes a linha encontrada pelo grep - f [arquivo]  Especifica que o texto que será localizado está no arquivo. - i  ignora a diferença entre maiúscula e minúscula. - n  mostra o nome de cada linha encontrada pelo grep -U  trata o arquivo que será tratado como binário. Exemplo grep “data” /etc/passwd ps –aux | grep inetd grep “data” /etc/passwd -A12 –B15 grep -n “sh” /etc/passwd Exercício Qual a linha está o texto /bin/ no arquivo /etc/passwd?
  • 16.
    Redirecionamentos e pipesstdin  entrada padrão ( standard input ) stdout  saída padrão (standard out) Quando não especifica o arquivo, por exemplo; o comando cat, vai ler dados stdin e mandar dados para stdout . Exemplo cat Olá Olá Bye Bye {ctrl-D} Agora você quer mudar a saída do sort para um arquivo, para gravar sua lista de compras no disco. A saída padrão é direcionada usando o simbolo”>” sort > lista_de_eventos Norte do Peru João Câmara Faixa Tocantins {ctrl-D} cat lista_de_eventos Saida não-destrutiva Exemplo cat >> lista_de_eventos Plataforma San Juan Santiago Del Estero {ctrl-D}
  • 17.
    Use o pipe ls > lista sort –r lista Gravou a saída do ls num arquivo lista, e então executou “sort –r”. Esse arquivo temporário não será usado. Existe outra maneira de fazer isso? PIPES (|), o stdout do primeiro comando é enviada para o stdin do segundo comando. No caso acima, queremos mandar o stdout do ls para o stdin do sort. ls | sort –r EXERCÍCIO Mostre a saída de uma lista de arquivos em /usr/bin, onde você poderá paginar. Use mais pipes  adicione o comando “tail -1” no exemplo “ls | sort –r” e veja o que acontece
  • 18.
    Tarefa em segundoplano, abortando tarefas, parando tarefas. yes > lixo Esse processo continua infinitamente. Para matar o processo clique a tecla (Ctrl-C). head lixo Para colocar o processo em segundo plano é necessário usar o caractere “&”. gedit lixo & [1] 25273 jobs [1] + Running yes > lixo O processo yes está rodando em segundo plano. Para matar a tarefa, use o comando kill e use como argumento um dos número acima. kill %1 ou kill 25273 Jobs PARANDO TAREFAS gedit lixo {ctrl-Z} [1] + gedit lixo > lixo Crtl-Z pára temporariamente até que você reinicie. Para reiniciar use o comando “fg” ( foreground ) fg A tarefa volta para o primeiro plano, Pare a tarefa novamente com ctrl-Z e use o comando bg para colocar a tarefa em segundo plano {ctrl-z} bg [1] + yes > lixo.
  • 19.
    Editores Existem diversoseditores vi (editor) emacs(editor) Open Office nedit (editor) gedit – Vamos usar esse no curso gedit lixo &
  • 20.
    Introdução ao comandoawk O nome é derivado das iniciais de seus três criadores, Aho, Kernighan, e Weinberger. Funciona com pipes ou diretamente com arquivos. Sua importância se for necessário fazer frequentemente alterações em vários arquivos texto, onde quer que seja que certos padrões apareçam; se for necessário extrair dados de algumas linhas de um arquivo enquanto o resto é descartado. Ou seja, com awk é possível gerenciar tarefas simples de &quot;reformatar dados&quot; com apenas algumas linhas de código. Com awk é possível: gerenciar pequenos banco de dados pessoais; gerar relatórios; validar dados; produzir índices, e fazer outras tarefas de preparação de documentos; fazer experimentos com algoritmos que podem ser adaptados posteriormente a outras linguagens de programação.   awk [ação] [Programa] [Arq1Entrada] [Arq2Entrada]
  • 21.
    Vamos começar awkUse o comando cat para criar o arquivo terremoto.txt 2007/07/31 21:09:20.9000 -3.024 36.423 10 4.7 MB QED TANZANIA 2007/07/31 19:38:33.5000 -13.862 170.494 635 4.6 MB QED VANUATU ISLANDS 2007/07/31 15:07:36.1000 27.336 126.852 16 5.7 MS QED RYUKYU ISLAND 2007/07/31 12:58:29.1000 28.227 138.979 509 5.2 MB QED BONIN ISLANDS 2007/07/30 23:37:50.3000 -17.262 -178.777 560 5.1 MB QED FIJI ISLANDS 2007/07/30 10:38:37.6000 1.998 97.946 30 4.9 MB QED SUMATRA 2007/07/30 06:20:34.6000 46.857 152.623 10 4.8 MB QED KURIL ISLANDS ----------------------------------- Agora faça cada comando e veja o resultado. awk ‘/MB/’ terremoto.txt  mostra somente as linhas que contem o texto MB awk ‘{print $3, $4}’ terremoto.txt  mostra o campo 3 e 4 do arquivo terremoto.txt awk ‘/MB/ {print $3, $4}’ terremoto.txt  O que esse comando faz? awk ‘/S/’ terremoto.txt  mostra as linhas que contem o caractere S awk ‘$1 ~ /1/’ terremoto.txt  o operador ~ mostra todas as linhas que contem o número 1 no primeiro campo awk ‘$6 == 4.6 {print $2, $1, $6}’ terremoto.txt  compara o número do sexto campo com valor 4.6.
  • 22.
    awk ‘$5 <=100’ terremoto ____________________________ o operador && -- “e” duas o mais condições. awk ‘$5 >= 500 && $5 <600’ terremoto O operador “,” seleciona o grupo de linhas. awk ‘/TANZANIA/,/SUMATRA/’ terremoto.txt Use o gedit para criar o arquivo pre_inicio com o texto BEGIN {print “Data hora Lat Lon Prof Mag Regiao”} {print} Para inserir comandos em arquivo usa-se a opção –f antes do nome contendo o programa em awk. Usando BEGIN . O programa pre_inicio usa BEGIN para inseri cabeçario. awk –f pre_inicio terremoto Função length sem argumento mostra o número de caracteres na linha, incluindo os espaços. A variável $0 imprime toda a linha. awk ‘{print length, $0}’ terremoto | sort NR – referente o número de linha NF – referente o número de campos FS – insere um espaço RS – insere uma nova linha EXERCÍCIO Veja o que o comando awk ‘length > 40 {print NR}’ terremoto Mostre do arquivo somente as linhas três quatro e cinco do arquivo terremoto.
  • 23.
    END  similar ao BEGIN awk ‘END {print NR, “eventos.”}’ terremoto Usando o comando “if” para mudar o tipo de magnitude. Edite o programa awk  altera_mag (use gedit ou cat) { if ($7 ~ /MB/) $7 = “MS” if ($7 ~ /MS/) $7 = “MB” print } awk –f altera_mag terremoto
  • 24.
    Printf (awk) Controlaa saída do print de acordo com formato. printf “formato do caractere” arg1, arg2,...,argn. \n  nova linha \t  [-][-x.[y]]conv x é extensão mínima do campo, e o .y o número de caracteres a direita do ponto decimal. Conv é a letra que especifica o formato. conv d  decimal e  notação científica f  específica de formato variável s  caracteres. Exemplo:Edite o texto abaixo no arquivo printf_demo BEGIN {print “Data hora Lat Lon Prof Mag Regiao”} {print \ “ ----------------------------------------------------------------------”} { if ($7 ~ /MB/) $7 = “MS” printf “%2.1f \t %10s \t %11s \t %8.3f \t %8.3f \t %3d magnitude \n”, $1, $2, $3, $4, $5, $6 } awk –f print_demo terremoto. tab
  • 25.
  • 26.
    Aula 2: ShellScript Começando!!! Por exemplo, se de tempos em tempos você quer saber informações do sistema como horário, ocupação do disco e os usuários que estão logados, é preciso digitar três comandos: date df w É melhor fazer um script chamado &quot;sistema&quot; e colocar estes comandos nele. O conteúdo do arquivo &quot;sistema&quot; seria o seguinte: #!/bin/bash date df w E para chamar este script, basta agora executar apenas um comando: ./sistema (não esqueça do comando “chmod”, veja se está executável, se torne-o) Isso é um Shell Script . Um arquivo de texto que contém comandos do sistema e pode ser executado pelo usuário
  • 27.
    Primeiro Shell ScriptEscolher um nome para o script Já temos um nome: sistema. Use apenas letras minúsculas e evite acentos, símbolos e espaço em branco Escolher o diretório onde colocar o script Para que o script possa ser executado de qualquer parte do sistema, mova−o para um diretório que esteja no seu PATH. O que o PATH? É o local onde está todos os arquivos executáveis. cat > .bashrc export PATH=$PATH:/home/aula/bin.  /usr/local/sac/bin {ctrl-d} source .bashrc Crie no seu HOME o diretório bin e dentro do diretório bin mova o arquivo sistema echo $PATH Colocar a chamada do Shell na primeira linha - A primeira linha do script deve ser: #!/bin/bash Para que ao ser executado, o sistema saiba que é o Shell quem irá interpretar estes comandos. Tornar o script um arquivo executável Use o seguinte comando para que seu script seja reconhecido pelo sistema como um comando executável:
  • 28.
    Melhorando Shell ScriptExecutar os três comandos seguidos resulta num bolo de texto na tela, misturando as informações e dificultando o entendimento. O comando &quot;echo&quot; serve para mostrar mensagens na tela. Que tal anunciar cada comando antes de executá-lo? #!/bin/bash (Vc poderá usar #!/bin/csh) echo &quot;Data e Horário:&quot; date echo echo &quot;Uso do disco:&quot; df echo echo &quot;Usuarios conectados:&quot; w Para usar o echo, basta colocar o texto entre &quot;aspas&quot;. Se nenhum texto for colocado, uma linha em branco mostrada.
  • 29.
    Interagir com oUsuário Para o script ficar mais completo, vamos colocar uma interação mínima com o usuário, pedindo uma confirmação antes de executar os comandos. O comando &quot;read&quot; leu o que o usuário digitou e guardou na variável RESPOSTA. Logo em seguida, o comando &quot;test&quot; checou se o conteúdo dessa variável era &quot;n&quot;. Se afirmativo, o comando &quot;exit&quot; foi chamado e o script foi finalizado. Nessa linha há vários detalhes importantes: O conteúdo da variável é acessado colocando−se um cifrão &quot;$&quot; na frente O comando test é muito útil para fazer vários tipos de checagens em textos e arquivos O operador lógico E &quot;&&&quot;, só executa o segundo comando caso o primeiro tenha sido OK. O operador OU é o &quot;||&quot; #!/bin/bash echo &quot;Vou buscar os dados do sistema. Posso continuar? [sn] &quot; read RESPOSTA test &quot;$RESPOSTA&quot; = &quot;n&quot; && exit echo &quot;Data e Horário:&quot; date echo echo &quot;Uso do disco:&quot; df echo echo &quot;Usuários conectados:&quot; w
  • 30.
    Melhorar o Códigodo Script Com o tempo, o script vai crescer, mais comandos vão ser adicionados e quanto maior, mais difícil encontrar o ponto certo onde fazer a alteração ou corrigir algum erro. Para poupar horas de estresse, e facilitar as manutenções futuras, é preciso deixar o código visualmente mais agradável e espaçado, e colocar comentários esclarecedores. Basta iniciar a linha com um &quot;#&quot; e escrever o texto do comentário em seguida. Estas linhas são ignoradas pelo Shell durante a execução. O cabeçalho com informações sobre o script e seu autor também é importante para se ter uma visão geral do que o script faz, sem precisar decifrar seu código. Também é possível colocar comentários no meio da linha # como este #!/bin/bash # sistema − script que mostra informações sobre o sistema # Autor: Fulano da Silva # Pede uma confirmação do usuário antes de executar echo &quot;Vou buscar os dados do sistema. Posso continuar? [sn] &quot; read RESPOSTA # Se ele digitou 'n', vamos interromper o script test &quot;$RESPOSTA&quot; = &quot;n&quot; && exit # O date mostra a data e a hora correntes echo &quot;Data e Horário:&quot; date echo # O df mostra as partições e quanto cada uma ocupa no disco echo &quot;Uso do disco:&quot; df echo # O w mostra os usuários que estão conectados nesta máquina echo &quot;Usuários conectados:&quot; w
  • 31.
    Fixando conceitos básicosAs variáveis são a base de qualquer script. É dentro delas que os dados obtidos durante a execução do script serão armazenados. Para definir uma variável, basta usar o sinal de igual &quot;=&quot; e para ver seu valor, usa−se o &quot;echo&quot;: Não podem haver espaços ao redor do igual &quot;=“ Exemplo: VARIAVEL=&quot;um dois tres“ echo $VARIAVEL um dois tres echo $VARIAVEL $VARIAVEL um dois tres um dois tres Ainda é possível armazenar a saída de um comando dentro de uma variável. Ao invés de aspas, o comando deve ser colocado entre &quot;$(...)&quot;, veja: HOJE=$(date) echo &quot;Hoje é: $HOJE&quot; Hoje é: Sáb Abr 24 18:40:00 BRT 2004 unset HOJE echo $HOJE &quot;unset&quot; apaga uma variável.
  • 32.
    O comando testO canivete suíço dos comandos do Shell é o &quot;test&quot;, que consegue fazer vários tipos de checagens, em números, textos e arquivos. Ele possui várias opções para indicar que tipo de teste será feito, algumas delas:
  • 33.
    Exemplo e ExercícioEm todos as comandos que aceitam condições (ex. if, while) deve ser posto um comando nessa condição, sendo avaliado o valor devolvido por esse comando. if ls &quot;$1&quot; > /dev/null 2>&1; then echo true else echo false fi Se o comando ls devolver true (0) o código relativo ao then é executado, se devolver false (1) é executado o código relativo ao else. o comando test pode ser simplificado na sua escrita para [ e fecha o comando ]. read arq sistema [ -f “$arq” ] && echo “$arq é um arquivo” Fazer o script &quot;testa−arquivos&quot;, que pede ao usuário para digitar um arquivo e testa se este arquivo existe. Se sim, diz se é um arquivo ou um diretório. Exemplo de uso: testa−arquivos Digite o arquivo: /naoexiste O arquivo '/naoexiste' não foi encontrado testa−arquivos Digite o arquivo: /tmp /tmp é um diretório testa−arquivos Digite o arquivo: /etc/passwd /etc/passwd é um arquivo
  • 34.
    Resposta testa-arquivos #!/bin/bashecho -n &quot;Digite o arquivo: &quot;; read ARQUIVO [ -d &quot;$ARQUIVO&quot; ] && echo &quot;$ARQUIVO é um diretorio&quot; [ -f &quot;$ARQUIVO&quot; ] && echo &quot;$ARQUIVO é um arquivo&quot; [ -f &quot;$ARQUIVO&quot; -o -d &quot;$ARQUIVO&quot; ] || echo &quot;O arquivo '$ARQUIVO' nao foi encontrado&quot; echo
  • 35.
    Referências Manual doawk ( http://www.inf.pucrs.br/~manssour/AWK/index.html ) Practical guide to the Unix system - M.K. Sobell Third Edition. Apostila do Aurélio (http://aurelio.net/shell/apostila/)
  • 36.
    If, For eWhile Assim como qualquer outra linguagem de programação, o Shell também tem estruturas para se fazer condicionais e loop. As mais usadas são if, for e while. for VAR in LISTA do comandos done if COMANDO then comandos else comandos fi No caso c shell é outro estrutura mais vamos nos fixar no C shell (endif) while do comandos done
  • 37.
    Há um atalhopara o test , que é o comando [. Ambos são exatamente o mesmo comando, porém usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens: #!/bin/bash echo &quot;Digite o número: &quot;; read VARIAVEL if [ &quot;$VARIAVEL&quot; −gt 10 ] then echo &quot;é maior que 10&quot; else echo &quot;é menor que 10&quot; fi o if testa um comando e não uma condição. Porém como já conhecemos qual o comando do Shell que testa condições, é só usá−lo em conjunto com o if. Por exemplo, para saber se uma variável é maior ou menor do que 10 e mostrar uma mensagem na tela informando: if test &quot;$VARIAVEL&quot; −gt 10 then echo &quot;é maior que 10&quot; else echo &quot;é menor que 10&quot; fi Condição if
  • 38.
    Condição while efor Já o while é um laço que é executado enquanto um comando retorna OK. Usaremos o test (ou o [). Por exemplo, para segurar o processamento do script enquanto um arquivo de lock não é removido: while test −f /tmp/lock do sleep 1 done o for percorre uma lista de palavras, pegando uma por vez: for numero in um dois três quatro cinco do echo &quot;Contando: $numero&quot; done
  • 39.
    Condição For Umaferramenta muito útil para usar com o for é o seq, que gera uma seqüência numérica. Para fazer o loop andar 10 passos, pode−se fazer: seq [opções] [primeiro] [incremento] [último] Primeiro  Número inicial da seqüência. Incremento  Número utilizado para avançar na seqüência. Último  Número final da seqüência. opções -f, -Formato de saída dos números da seqüência. Utilize o estilo do printf para ponto flutuante. -s, Usa [string] para separar a seqüência de números . -w, zeros na frente dos números mantendo a seqüência alinhada. seq 0 2 10 seq -w 0 10 seq -f%f 0 10 seq -s&quot;, &quot; 0 10 ----------- for passo in $(seq 10) O mesmo passo anterior pode ser feito com o while, usando um contador: i=0 while test $i −le 10 do i=$((i+1)) echo &quot;Contando: $i&quot; done E temos ainda o loop infinito, com condicional de saída usando o &quot;break¨: while : do if test −f /tmp/lock then echo &quot;Aguardando liberação do lock...“ sleep 1 else break fi done
  • 40.
    Exercícios Vc tambémtem que aprender a se virar sozinho! relacao.sh -- > Recebe dois números como parâmetro e mostra a relação entre eles. Exemplo: $ ./relacao.sh 3 5 3 é menor 5 $ ./relacao.sh 5 3 5 é maior 3 $ ./relacao.sh 5 5 5 é igual 5 Reposta #!/bin/sh if [ $1 −eq $2 ] then echo &quot;$1 é igual $2&quot; if [ $1 −lt $2 ] then echo &quot;$1 é menor $2&quot; else echo &quot;$1 é maior $2&quot; fi _ #!/bin/bash echo “digite o primeiro numero’ read prim echo ‘digie o segundo numero’ read seg If [ $prim –eq $seg ]; then echo “$prim é igual $seg“ fi If [ $prim –lt $seg ]; then echo “$prim é menor $seg” fi If [ $prim –gt $seg ]; then echo “$prim é maior $sef” fi
  • 41.
    zerador.sh Recebe umnúmero como parâmetro e o diminui até chegar a zero, mostrando na tela cada passo, numa mesma linha. Exemplo: $ ./zerador.sh 5 5 4 3 2 1 0 $ ./zerador.sh 10 10 9 8 7 6 5 4 3 2 1 0 Resposta #!/bin/bash i=$1 while [ $i −ge 0 ]; do echo −n &quot;$i &quot; i=$((i−1)) done echo
  • 42.
    substring.sh Recebe duaspalavras como parâmetro e checa se a primeira palavra está contida dentro da segunda. Só mostra mensagem informativa em caso de sucesso, do contrário não mostra nada. Exemplo: $ ./substring.sh ana banana ana está contida em banana $ ./substring.sh banana maria $ ./substring.sh banana $ ./substring.sh $ Dica: Veja se o comando grep é útil! #!/bin/sh [ $# −ne 2 ] && exit echo $2 | grep −qs $1 && echo &quot;$1 está contida em $2&quot;
  • 43.
    juntatudo.sh Mostra natela &quot;grudados&quot; todos os parâmetros recebidos na linha de comando, como uma única palavra. Exemplo: $ ./juntatudo.sh a b c d e f verde azul abcdefverdeazul Pesquise sobre o comando tr man tr #!/bin/sh echo $* | tr −d ' '
  • 44.
    users.sh Do arquivo/etc/passwd, mostra o usuário e o nome completo de cada usuário do sistema (campos 1 e 5) separados por um TAB. Exemplo: $ ./users.sh ftp FTP User nobody Nobody named Domain name server xfs X Font Server mysql MySQL server aula aula Use os comandos cut e tr #!/bin/sh cat /etc/passwd | cut −d : −f 1,5 | tr : '\t'
  • 45.
    shells.sh Do arquivo/etc/passwd, mostra todos os shells (último campo) que os usuários usam. Não mostrar linhas repetidas. Exemplo: $ ./shells.sh /bin/bash /bin/false /bin/sync /sbin/halt /sbin/shutdown Pesquise sobre o comando uniq #!/bin/sh cat /etc/passwd | cut −d : −f 7 | sort | uniq
  • 46.
    parametros.sh Mostra natela todos os parâmetros recebidos na linha de comando, contando−os. Exemplo: $ ./parametros.sh a b c d e f Parâmetro 1: a Parâmetro 2: b Parâmetro 3: c Parâmetro 4: d Parâmetro 5: e Parâmetro 6: f Pesquise sobre o comando shift #!/bin/bash i=0 while [ &quot;$1&quot; ] ; do i=$((i+1)) echo &quot;Parâmetro $i: $1&quot; shift done

Notas do Editor

  • #23 awk ‘NR == 2, NR == 4’ terremoto