shell script
DESCRIPTION
TRANSCRIPT
Shell Script@deniscostadsc
DENIS COSTA
DENIS COSTA
Coding Dojo
Tópicos:
• O que é shell?• Sabores de shell• O que é Shell Script?• Shell Script é...• Redirecionamentos• Caracteres Curinga• Sintaxe• Ajuda
O que é shell?
hardware
kernel
SHELL
aplicativos
usuário
Sabores de shell
Bourne Shell (sh)Bourne-Again Shell (bash)Almquist Shell (ash)Debian Almquist Shell (dash)Z Shell (zsh)Korn shell (ksh)...
O que é Shell Script?
$ rm *~ # linha de comando$ cat myscript.sh # scriptrm *~$ ./myscript.sh
Shell Script é...
...rápido para prototipar
...fácil
...ótimo para automatizar tarefas
...ótimo para executar tarefas agendadas
...ótimo para iniciar aplicativos
...ótimo para instalar software
...
...horrível para multiplataforma
...inpensável para alto desempenho
...lento para IO pesado
...
Redirecionamento
$ ## 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
$ ## Standard Error$ # Saída de erro para o arquivo$ comando 2> arquivo $$ # Saída de erro para o fim do arquivo$ comando 2>> arquivo
$ ## 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
$ ## Separando as saídas$ # Saída padrão para arquivo$ # e saída de erro para outro_arquivo$ comando 1> arquivo 2> outro_arquivo
$ ## Standard Input$$ comando < arquivo$ comando <<< texto
$ ## Pipe$ # Redireciona a saída padrão do$ # comando1 para a entrada padrão do$ # comando2 $ comando1 | comando2
Caracteres Curinga
Caracteres curinga parecem Regex,mas são DIFERENTES.
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
$ ## Expansão dos curingas$ ls *a.jpg a.pdf b.pdf cd.pdf c.pdf$ ls ?.pdfa.pdf b.pdf c.pdf$ ls [abc].pdfa.pdf b.pdf c.pdf$ ls [!a].pdfb.pdf c.pdf$ ls a.{pdf,jpg}a.jpg a.pdf
Sintaxe
#!/bin/bash# Atribuindo valores as variáveisnumero=1text=TextoSemAspasMasSemEspacostext2=”Texto com aspas e com espacos”# Usando valores das variáveisecho $numeroecho $textecho $text2
#!/bin/bash# Substituição de variáveis
var=”Ola”echo $var# echo Ola
#!/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"
$ # A passagens de parametros dos scripts$ # é feita de maneira posicional$$ ./myscript.sh parametro1 paramentro2
#!/bin/bash# O recuperação dos valores passados# como parametro é feito através# de variáveis especiais
echo $1 # 1° parametroecho $2 # 2° parametroecho $11 # 1° parametro seguido de 1echo ${11} # 11° parametro
#!/bin/bash# Ainda existem variáveis para acessar# os parametros de várias formas
echo $* # parametros separados pelo $IFSecho $@ # parametros “p1” “p2”echo $# # numero de parametros
#!/bin/bash# O if verifica o exit status do comando
if grep "denis" texto.txtthenecho "Achei ele"
elseecho "Ele escapou"
fi
#!/bin/bash# Para fazer comparações use o builtin# command test...
a=1if test $a == 1thenecho "É igual"
elseecho "É diferente"
fi
#!/bin/bash# ... ou sua sintaxe com [ ]
a=1if [ $a == 1 ]thenecho "É igual"
elseecho "É diferente"
fi
#!/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 10do
echo $numberdone
#!/bin/bash# Se você quisesse iterar sobre uma grande# sequência de números
for number in $(seq 100)do
echo $numberdone
#!/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 $numberdone
#!/bin/bash# CSV Parser de pobrecomma=','new_line=''old_IFS=$IFSIFS=$new_linefor line in $(cat cars.csv); do
IFS=$commafor item in $line; do
echo -ne "$item\t"doneecho “”
doneIFS=$oldIFS
#!/bin/bash# O while funciona como o if e executa# enquanto o comando verificado retorna exit# status 0
while ping -c 2 www.google.comdo
echo “Sim, temos internet!!”done
#!/bin/bash# O until é muito semelhante ao while mas# executa enquanto o exit status é diferente# de 0
until ping -c 2 www.google.comdo
echo "Ainda estamos sem internet 8("done
#!/bin/bash# O case permite vericar o conteúdo de uma# variável várias vezes
case $SO inlinux)
echo "É Linux";;w*)
echo "Isso não é um bom sinal";;*)
echo "Sistema não reconhecido";;
esac
#!/bin/bash# A declaração de funções é feito com a# palavra reservda function
function nome_da_funcao(){comando...
}
#!/bin/bash# A invocação de funções e a# passagens de parâmentros é# feito como os scripts
funcao parametro1 parametro2
#!/bin/bashfunction map(){
func=$1for item in $2; do
$func $itemdone
}
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)doneecho $acumulador
}
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
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
function soma(){echo $(($1 + $2))
}reduce "soma" "1 2 3 4"# 10
function concat(){echo $1$2
}reduce "concat" "O Rato Roeu A Roupa Do Rei De Roma"# ORatoRoeuARoupaDoReiDeRoma
# /bin/bash# URL checker burrofunction get_status_code(){
echo $(curl -sL -w '\n%{http_code}\n' $1 | tail -1)}
for url in $(cat urls.txt); doif [ $(get_status_code "$url") != "200" ]; then
echo "$url" >> urls_down.txtfi
done
#/bin/bash# URL checker inteligentefunction 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
Ajuda
● $man bash● http://aurelio.net/shell/● http://tldp.org/LDP/abs/abs-guide.pdf
Obrigado =)