Slide 1

Slide 1 text

Shell Script @deniscostadsc

Slide 2

Slide 2 text

DENIS COSTA

Slide 3

Slide 3 text

DENIS COSTA Coding Dojo

Slide 4

Slide 4 text

Tópicos: • O que é shell? • Sabores de shell • O que é Shell Script? • Shell Script é... • Redirecionamentos • Caracteres Curinga • Sintaxe • Ajuda

Slide 5

Slide 5 text

O que é shell?

Slide 6

Slide 6 text

hardware kernel SHELL aplicativos usuário

Slide 7

Slide 7 text

Sabores de shell

Slide 8

Slide 8 text

Bourne Shell (sh) Bourne-Again Shell (bash) Almquist Shell (ash) Debian Almquist Shell (dash) Z Shell (zsh) Korn shell (ksh) ...

Slide 9

Slide 9 text

O que é Shell Script?

Slide 10

Slide 10 text

$ rm *~ # linha de comando $ cat myscript.sh # script rm *~ $ ./myscript.sh

Slide 11

Slide 11 text

Shell Script é...

Slide 12

Slide 12 text

...rápido para prototipar ...fácil ...ótimo para automatizar tarefas ...ótimo para executar tarefas agendadas ...ótimo para iniciar aplicativos ...ótimo para instalar software ...

Slide 13

Slide 13 text

...horrível para multiplataforma ...inpensável para alto desempenho ...lento para IO pesado ...

Slide 14

Slide 14 text

Redirecionamento

Slide 15

Slide 15 text

$ ## 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

Slide 16

Slide 16 text

$ ## Standard Error $ # Saída de erro para o arquivo $ comando 2> arquivo $ $ # Saída de erro para o fim do arquivo $ comando 2>> arquivo

Slide 17

Slide 17 text

$ ## 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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

$ ## Standard Input $ $ comando < arquivo $ comando <<< texto

Slide 20

Slide 20 text

$ ## Pipe $ # Redireciona a saída padrão do $ # comando1 para a entrada padrão do $ # comando2 $ comando1 | comando2

Slide 21

Slide 21 text

Caracteres Curinga

Slide 22

Slide 22 text

Caracteres curinga parecem Regex, mas são DIFERENTES.

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

$ ## 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

Slide 25

Slide 25 text

Sintaxe

Slide 26

Slide 26 text

#!/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

Slide 27

Slide 27 text

#!/bin/bash # Substituição de variáveis var=”Ola” echo $var # echo Ola

Slide 28

Slide 28 text

#!/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"

Slide 29

Slide 29 text

$ # A passagens de parametros dos scripts $ # é feita de maneira posicional $ $ ./myscript.sh parametro1 paramentro2

Slide 30

Slide 30 text

#!/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

Slide 31

Slide 31 text

#!/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

Slide 32

Slide 32 text

#!/bin/bash # O if verifica o exit status do comando if grep "denis" texto.txt then echo "Achei ele" else echo "Ele escapou" fi

Slide 33

Slide 33 text

#!/bin/bash # Para fazer comparações use o builtin # command test... a=1 if test $a == 1 then echo "É igual" else echo "É diferente" fi

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

#!/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

Slide 36

Slide 36 text

#!/bin/bash # Se você quisesse iterar sobre uma grande # sequência de números for number in $(seq 100) do echo $number done

Slide 37

Slide 37 text

#!/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

Slide 38

Slide 38 text

#!/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

Slide 39

Slide 39 text

#!/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

Slide 40

Slide 40 text

#!/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

Slide 41

Slide 41 text

#!/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

Slide 42

Slide 42 text

#!/bin/bash # A declaração de funções é feito com a # palavra reservda function function nome_da_funcao(){ comando ... }

Slide 43

Slide 43 text

#!/bin/bash # A invocação de funções e a # passagens de parâmentros é # feito como os scripts funcao parametro1 parametro2

Slide 44

Slide 44 text

#!/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 }

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

function soma(){ echo $(($1 + $2)) } reduce "soma" "1 2 3 4" # 10

Slide 48

Slide 48 text

function concat(){ echo $1$2 } reduce "concat" "O Rato Roeu A Roupa Do Rei De Roma" # ORatoRoeuARoupaDoReiDeRoma

Slide 49

Slide 49 text

# /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

Slide 50

Slide 50 text

#/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

Slide 51

Slide 51 text

Ajuda

Slide 52

Slide 52 text

● $man bash ● http://aurelio.net/shell/ ● http://tldp.org/LDP/abs/abs-guide.pdf

Slide 53

Slide 53 text

Obrigado =)