Oficina de ShellScript
             Segunda Parte
                 Wildcards
           Variáveis de Ambiente
          Comandos em Shell Script
         Parâmetros para o programa
               Mais comandos
                  /dev/null


           Bruno L. Albrecht
             Felipe A. Chies
           PET Computação UFRGS
                      
Wildcards

       Recurso utilizado para especificar um ou mais 
        arquivos/diretório de uma vez só.
       Permite a filtragem do que será listado/copiado/
        apagado/etc
       É uma feature que deixa a shell “mais 
        poderosa” que a GUI no trato de arquivos.
       Quatro tipos:
           *, ?, [ ] e { }
                               
Wildcards

       *: qualquer coisa! (zero ou mais caracteres)
           rm *.txt → apaga todos os arquivos que terminem 
            com .txt


       ?: um único caractere qualquer!
           rm log?.txt → log1.txt, loga.txt, lob[.txt, etc
           rm *?.* → todos os arquivos não ocultos
           Obs.: para nos referirmos a um arquivo que um 
            wildcard no nome, utilizamos 'wildcard'
                                       
Wildcards

       [ ] : um dos caracteres listados (ou não)
           [abcd] : a ou b ou c ou d
           [a­d] : qualquer um no intervalo de 'a' a 'd'
           [!abcd] : qualquer um, menos a,b,c,d
           [!a­d] : qualquer um, menos os que estão no 
            intervalo de 'a' a 'd'
           Exemplo:
                sudo umount /dev/[hs]d[a­d][1­9]
                     desmonta todos os dispositivos
                                          
Wildcards

       { } : cada opção separada por vírgulas é 
        considerada apenas uma vez
           echo t{r,igr,rist}es
                tres tigres tristes
           echo alun{o,a}{,s}
                aluno alunos aluno alunos




                                        
ShellScript: Introdução

   Shell
       Interpretador de comandos;
   Script
       É uma descrição geral de qualquer programa 
        escrito em linguagem interpretada, ou seja, não 
        compilada;
       Temos script em PHP, Ruby, script em PERL e 
        também Shell Script;
Objetivos

   Facilitar as tarefas repetidas do adminstrador:
       evita a redigitação de comandos;
       podem ser agendados para execução através da 
        tabela crontab (man cron);
   Scripts podem fazer tarefas complexas
       podemos combinar diversos comandos, com 
        controladores de fluxo e variáveis;
   São “rápidos” de serem criados e não precisam 
    ser compilados;
Hello World

   Muito simples!!!
    Muito simples:
   Crie o arquivo: gedit hello.sh &

    #!/bin/bash
    echo "Hello World!!!"

   Para executá­lo:
       chmod +x hello.sh
       ./hello.sh
Variáveis

   O bash reconhece uma variável quando ela 
    começa com $;
   Declaração: var=“valor”
       valor pode ser número, frase, outras variáveis ou 
        comando. 
       Pode ser expressado entre “ ”(aspas duplas), ' ' 
        (apóstrofes) ou ` `(crases);
Variáveis

   Aspas duplas: valor da variável será 
    interpretado;
       variavel="Meu login é: $USER"
       echo $variavel
            Meu login é: Bruno
   Apóstrofes: declaração literal
       variavel='Meu login é: $USER'
       echo $variavel
            Meu login é: $USER
Entre crases

   Crases: vão interpretar os comandos 
    declarados. Se forem combinados com texto 
    numa expressão, deve­se usar as aspas 
    juntamente!!!
       variavel=“Meu diretório atual é: `pwd`”
       echo $variavel
            Meu diretório atual é: /home/bruno
       Obs.: É o mesmo que $(comando)
            var=$(pwd)
PARÂMETROS

       É um array de parâmetros!
           De $1 a $9
           $0 → nome do programa
           $# → quantidade de parâmetros
           $* → conjunto de todos os parâmetros
           Shift n → utilizado para deslocar n parâmetros




                                    
Variáveis de Ambiente

       São variáveis LOCAIS ou GLOBAIS já 
        definidas pelo sistema operacioal


       Podem ser redefinidas


       Exemplo:
           O nome do usuário é determinado a partir de uma 
            variável de ambiente: $USER
                                  
Variáveis de Ambiente

    Principais variáveis globais:
        PATH diretório onde podem ser encontrados os 
         executáveis
        USER    nome (login) do usuário
        HOME    diretório home do usuário
        HOST    nome do host (máquina)
        SHELL shell ativo
        PS1     mensagem no terminal
        IFS     separador de parâmetros (default: ” ”)
    A lista completa pode ser obtida através do comando 
                                
Variáveis de Ambiente
   Para definir uma variável de ambiente GLOBAL:
       export VARIAVEL=conteúdo
   Para definir uma variável de ambiente LOCAL:
       VARIAVEL=conteudo
   Exemplo: 
       export PATH=$PATH:/meu_dir


   Obs.: esta forma de definir variáveis é 
 
    TEMPORÁRIA, ou seja, apenas enquanto o shell 
                            

    estiver ativo
Variáveis de Ambiente

       Para definir variáveis globais e locais 
        PERMANENTEMENTE, devemos alterar os 
        seguintes arquivos:
            ~./bashrc → somente para o usuário atual
           /etc/bash.bashrc → para todos os usuários
       Imprimir o conteúdo de uma variável:
           echo $VARIAVEL
       Deletar uma variável:
 
           unset VARIÁVEL         
Expressões aritméticas

       Para o Shell executar operações aritméticas, 
        devemos utilizar $((expressão))
           echo $((2+2))
           var1=$((var2+var1))
       Ou então, o comando let:
           let var1++
           let var2­­


                                   
Expressões aritméticas

       x++, ++x, x­­, ­­x: [pós,pré]­[in,de]cremento
                             y
       x**y: potenciação (x )
       x*y, x/y, x%y: multiplicação, divisão, resto
       <, <=, >, >=, ==, !=: comparações
       &&, ||: AND e OR lógicos




                                  
Comandos: test
       Descrição: testar qualquer coisa!
       test $var1 ­lt $var2
            Obs.: resultado em $?




                                      
if

        O comando if testa o STDERR (variável de 
         ambiente $?), mas, para ficar semelhante à 
         sintaxe do C, utilizamos o comando test
        If test $variavel ­gt 10     If [ $variavel ­gt 10 ]
        then                         then
             echo ”é maior que 10”         echo ”é maior que 10”
        else                         else
             echo ”é menor que 10”         echo ”é menor que 10”
        fi                           fi



        Atalho do comando test no if:
 
             [ expressão ] → não do espaço antes e depois da 
                                     
              expressão
case

   Para não precisarmos concatenar milhares de 
    ifs, utilizamos o case:
     if [ $var ­eq 1 ]           case $var in
     then                           1) <comandos> ;;
           <comandos>               2) <comandos> ;;
     elif [ $var ­eq 2 ]
                                    3) <comandos> ;;
     then
                                    4) <comandos> ;;
           <comandos>
     elif [ $var ­eq 3 ]            *) <comandos>
     then                        esac
           <comandos>
     elif [ $var ­eq 4 ]
                           ● Não há ;; no último grupo
                           ● Para fechar o case, usamos “esac”
     then
                           ● Podemos usar wildcards nos padrões de 
           <comandos>
     else                  grupos. ex.: [1­4], ?, ??, 3|4, ?0|?5, [1234] 
           <comandos>      etc
     fi
For

  for numero in um dois três quatro cinco
  do
        echo "Contando: $numero"
  done

     Um comando muito útil para utilizar o for é o seq, 
      que gera sequências de números:
for num in $(seq 10)                        for num in $(seq 6 10)
do                                          do
    <...>                                       <...> 
done            for num in $(seq 0 2 10)    done
                do
                    <...>
                done
For

 for par
 do
       echo "Parâmetro: $par"
 done

   Neste caso, não colocamos o “in” depois da 
    variável. Isto serve para a variável (no caso 
    “par”) receber cada parâmetro passado para o 
    programa a cada laço do for.
For

   Podemos ainda usar uma sintaxe parecida com 
    a do C.
                                      for (( ; i<=9 ; ))
    for ((i=0 ; i<=9 ; i++))          do
    do                                    let i++;
          echo ­n “$i “                   echo ­n “$i “
    done                              done

   Outra forma de for
        for arq in *            1 ­> arquivo1.txt
                                2 ­> arquivo2.sh
        do                      3 ­> arquivo3.bla
            let i++;            4 ­> arquivo4.doc
            echo “$i ­> $arq”   etc...
        done
Break e Continue

      break: pára o laço
      continue: ignora o que tem embaixo e volta 
       para o início do laço
for ((i=0 ; ; i++))         $ ./testefor
                            0 1 2 3 4 5 6 7 8 9
do
    echo ­n “$i “         for ((i=0 ; ; i++))
    if [ i ­lt 9 ]        do                      $ ./testefor2
    then                      echo ­n “$i “       0 1 2 3 4 5 6 7 8 9
               continue       if [ i ­eq 9 ]
    else                      then
               break                   break;
done                      done
While
   Utilizando um contador com o while:

                            while :
                            do
i=0
                                  if test ­f /tmp/lock
while test i ­le 10
                                  then
do
                                          echo "Aguardando lock..."
      i=$((i+1))
                                          sleep 1
      echo "Contando: $i"
                                  else
done
                                          break
                                  fi
                            done

   Para um loop infinito (saindo com break):
Until

    Igual ao while, mas o teste é feito após os 
     comandos serem executados

     i=0                              $./testeuntil
     until [ $i ­eq 9 ]               0 1 2 3 4 5 6 7 8
     do                               $
          echo ­n “$i ”
          let i++
     done
                                                     $ ./testeuntil2
 until ! who | grep pet                              pet pts/0 Jan 4 16:47 (143.54.12.140)
 do                                                  pet pts/0 Jan 4 16:48 (143.54.12.140)
      sleep 60                                       ...
 done                                                pet pts/0 Jan 4 17:39 (143.54.12.140)
 echo ­n “usuário pet foi embora!!”                  usuário pet foi embora às 17:39h!!
 echo “às $(date “%H:%Mh”)”                          $
Interação com o usuário
   read: recebe uma lista de parâmetros e salva nas 
    variáveis
       Se houver mais parâmetros do que variáveis, a última 
        recebe o resto
   echo: imprime uma mensagem no STDOUT
         $ read var1 var2 var3
         Curso de ShellScript        $ read var1 var2
         $ echo $var1                Curso de ShellScript
         Curso                       $ echo $var1
         $ echo $var2                Curso
         de                          $ echo $var2
         $ echo $var3                de ShellScript
         ShellScript
Leitura de Arquivos

   Duas formas:
                         Cat arquivo.txt |
    while read LINHA     while read LINHA
    do                   do
       echo $LINHA          echo $LINHA
    done < arquivo.txt   done


   O while termina quando o read encontra um 
    EOF (leitura mal sucedida)

Oficina de shell script

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