Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Shell Script

Shell Script

Shell Script é uma ótima maneira de automatizar tarefas repetitivas em ambientes Unix-like.

Denis Costa

July 01, 2012
Tweet

More Decks by Denis Costa

Other Decks in Technology

Transcript

  1. Tópicos: • O que é shell? • Sabores de shell

    • O que é Shell Script? • Shell Script é... • Redirecionamentos • Caracteres Curinga • Sintaxe • Ajuda
  2. Bourne Shell (sh) Bourne-Again Shell (bash) Almquist Shell (ash) Debian

    Almquist Shell (dash) Z Shell (zsh) Korn shell (ksh) ...
  3. $ rm *~ # linha de comando $ cat myscript.sh

    # script rm *~ $ ./myscript.sh
  4. ...rápido para prototipar ...fácil ...ótimo para automatizar tarefas ...ótimo para

    executar tarefas agendadas ...ótimo para iniciar aplicativos ...ótimo para instalar software ...
  5. $ ## Standard Output $ # Saída padrão para o

    arquivo $ comando > arquivo $ comando 1> arquivo $ $ # Saída padrão para o fim do arquivo $ comando >> arquivo $ comando 1>> arquivo
  6. $ ## Standard Error $ # Saída de erro para

    o arquivo $ comando 2> arquivo $ $ # Saída de erro para o fim do arquivo $ comando 2>> arquivo
  7. $ ## Juntando as saídas $ # Saída padrão para

    arquivo $ # e saída de erro para saída padrão $ comando 1> arquivo 2>&1
  8. $ ## Separando as saídas $ # Saída padrão para

    arquivo $ # e saída de erro para outro_arquivo $ comando 1> arquivo 2> outro_arquivo
  9. $ ## Pipe $ # Redireciona a saída padrão do

    $ # comando1 para a entrada padrão do $ # comando2 $ comando1 | comando2
  10. Curinga Padrão * Zero ou mais caracteres ? Um caractere

    qualquer [abc] Um caractere que esteja na lista [!abc] Um caractere que não esteja na lista {pdf,jpg} Palavra que esteja na lista [a-c] Um caractere que esteja no range [!a-c] Um caractere que não esteja no range
  11. $ ## Expansão dos curingas $ ls * a.jpg a.pdf

    b.pdf cd.pdf c.pdf $ ls ?.pdf a.pdf b.pdf c.pdf $ ls [abc].pdf a.pdf b.pdf c.pdf $ ls [!a].pdf b.pdf c.pdf $ ls a.{pdf,jpg} a.jpg a.pdf
  12. #!/bin/bash # Atribuindo valores as variáveis numero=1 text=TextoSemAspasMasSemEspacos text2=”Texto com

    aspas e com espacos” # Usando valores das variáveis echo $numero echo $text echo $text2
  13. #!/bin/bash # Substituição de comandos file `which bash` # file

    /bin/bash echo $(echo $(echo $(echo “oi”))) # echo $(echo $(echo "oi")) # echo $(echo "oi") # echo "oi"
  14. $ # A passagens de parametros dos scripts $ #

    é feita de maneira posicional $ $ ./myscript.sh parametro1 paramentro2
  15. #!/bin/bash # O recuperação dos valores passados # como parametro

    é feito através # de variáveis especiais echo $1 # 1° parametro echo $2 # 2° parametro echo $11 # 1° parametro seguido de 1 echo ${11} # 11° parametro
  16. #!/bin/bash # Ainda existem variáveis para acessar # os parametros

    de várias formas echo $* # parametros separados pelo $IFS echo $@ # parametros “p1” “p2” echo $# # numero de parametros
  17. #!/bin/bash # O if verifica o exit status do comando

    if grep "denis" texto.txt then echo "Achei ele" else echo "Ele escapou" fi
  18. #!/bin/bash # Para fazer comparações use o builtin # command

    test... a=1 if test $a == 1 then echo "É igual" else echo "É diferente" fi
  19. #!/bin/bash # ... ou sua sintaxe com [ ] a=1

    if [ $a == 1 ] then echo "É igual" else echo "É diferente" fi
  20. #!/bin/bash # O for funciona como um for each, e

    separa # os elementos usando o conteúdo do $IFS # $IFS é uma variável de ambiente que contém # o(s) separador(es) padrão(ões) for number in 1 2 3 4 5 6 7 8 9 10 do echo $number done
  21. #!/bin/bash # Se você quisesse iterar sobre uma grande #

    sequência de números for number in $(seq 100) do echo $number done
  22. #!/bin/bash # Nas versões mais novas do Bash é possível

    # usar uma sintaxe que lembra a do C. for ((number = 0; number < 10; number++)) do echo $number done
  23. #!/bin/bash # CSV Parser de pobre comma=',' new_line=' ' old_IFS=$IFS

    IFS=$new_line for line in $(cat cars.csv); do IFS=$comma for item in $line; do echo -ne "$item\t" done echo “” done IFS=$oldIFS
  24. #!/bin/bash # O while funciona como o if e executa

    # enquanto o comando verificado retorna exit # status 0 while ping -c 2 www.google.com do echo “Sim, temos internet!!” done
  25. #!/bin/bash # O until é muito semelhante ao while mas

    # executa enquanto o exit status é diferente # de 0 until ping -c 2 www.google.com do echo "Ainda estamos sem internet 8(" done
  26. #!/bin/bash # O case permite vericar o conteúdo de uma

    # variável várias vezes case $SO in linux) echo "É Linux" ;; w*) echo "Isso não é um bom sinal" ;; *) echo "Sistema não reconhecido" ;; esac
  27. #!/bin/bash # A declaração de funções é feito com a

    # palavra reservda function function nome_da_funcao(){ comando ... }
  28. #!/bin/bash # A invocação de funções e a # passagens

    de parâmentros é # feito como os scripts funcao parametro1 parametro2
  29. #!/bin/bash function map(){ func=$1 for item in $2; do $func

    $item done } function reduce(){ func=$1 acumulador=$(cut -d ' ' -f 1 <<< "$2") resto=$(cut -d ' ' -f 2- <<< "$2") for item in $resto; do acumulador=$($func $acumulador $item) done echo $acumulador }
  30. function quadrado(){ echo $(($1 * $1)) } map "quadrado" "1

    2 3 4 5 6 7 8 9 10" # 1 # 4 # 9 # 16 # 25 # 36 # 49 # 64 # 81 # 100
  31. function primeira(){ echo $(cut -c 1 <<< "$1") } map

    "primeira" "O Rato Roeu A Roupa Do Rei De Roma" # O # R # R # A # R # D # R # D # R
  32. function concat(){ echo $1$2 } reduce "concat" "O Rato Roeu

    A Roupa Do Rei De Roma" # ORatoRoeuARoupaDoReiDeRoma
  33. # /bin/bash # URL checker burro function get_status_code(){ echo $(curl

    -sL -w '\n%{http_code}\n' $1 | tail -1) } for url in $(cat urls.txt); do if [ $(get_status_code "$url") != "200" ]; then echo "$url" >> urls_down.txt fi done
  34. #/bin/bash # URL checker inteligente function get_status_code(){ echo $(curl -sL

    -w '\n%{http_code}\n' $1 | tail -1) } function request(){ url=$1 if [ $(get_status_code "$url") != "200" ]; then echo "$url" >> urls_down.txt fi } for url in $(cat urls.txt); do request $url & done