Introdução ao 
Shell Script 
(versão estendida) 
Hugo Maia Vieira 
@hugomaiavieira 
novembro de 2014 Esta obra é licenciada sob uma licença 
Creative Commons
O que é Shell Script? 
O que é shell? 
O que é script? 
scripts em shell == Shell Scritp ==
O Shell, terminal, prompt, 
linha de comando
Scripts executáveis (Unix) 
chmod +x arquivo 
Localização do interpretador: hashbang¹ (#!) 
#!/bin/sh 
ou 
#!/usr/bin/env sh 
¹ http://en.wikipedia.org/wiki/Shebang_(Unix)
Variáveis 
$ VARIAVEL='bla bla bla' 
$ echo $VARIAVEL 
bla bla bla 
+ Não pode haver espaços ao redor do igual 
+ O comando local variáveis locais 
+ O comando unset elimina a variável 
+ É possível armazenar a saída de um comando usando o $(...): 
$ DATA=$(date +%x) 
$ echo $DATA 
09-11-2011
Expressões aritméticas 
+ A construção utilizada para indicar uma expressão aritmética 
É $((...)). Sim, com 2 parênteses! 
$ echo $((5*8)) 
40 
$ SOMA=$((2+5+1)) 
$ echo $SOMA 
8 
$ RESPOTA=$((SOMA*2)) 
$ echo $RESPOSTA 
16
O comando test 
$ test EXPRESSÃO 
$ test [[ EXPRESSÃO ]] 
$ man test 
$ test "a" = "a" && echo "é igual!" 
é igual 
$ echo $? 
0 
$ [[ "a" = "b" ]] && echo "é igual!" 
$ echo $? 
1 
+ Para a sintaxe usando colchetes, deve ter um espaço 
entre a expressão e os colchetes.
if COMANDO 
then 
comandos 
elif COMANDO 
then 
comandos 
else 
comandos 
fi 
if 
+ O if testa um comando e não uma condição. Porém, 
existe o comando test que testa condições. 
if [[ "a" -gt 25 ]]; then 
echo "é maior que 25" 
else 
echo "é menor que 25" 
fi 
+ Fique ligado: o if é fechado com o fi, ou seja, if invertido.
for 
for VARIAVEL in LISTA 
do 
comandos 
done 
+ O for percorre uma lista, pegando um elemento a cada iteração. 
echo 'Seu computador irá explodir em 5 segundos' 
for numero in cinco quatro três dois um 
do 
echo "$numero" 
sleep 1 
done 
echo "BUUMMMM!!!"
for 
+ Um comando muito útil para usar com o for é o seq, que 
gera uma sequência numérica. 
for numero in $(seq 5) 
+ Outro comando muito útil para usar com o for é o cat: 
contador=0 
for pais in $(cat dados.txt) 
do 
contador=$((contador+1)) 
echo "$contador: $pais" 
done
while 
while COMANDO 
do 
comandos 
done 
numero=0 
while test $numero -le 10 
do 
numero=$((numero+1)) 
echo "Contando: $numero" 
done 
+ Existem também o until, que têm as mesmas características do 
while. a única diferença é que ele faz o contrário.
case 
case VARIAVEL in 
caso1) comando; comando;; 
caso2) comando; comando;; 
*) comando;; 
esac 
case "$1" in 
-h | --help) echo "$MENSAGEM_DE_USO" ;; 
-V | --version) echo "1.0" ;; 
*) echo "Opção inválida: $1" ;; 
esac 
+ Fique ligado: o case é fechado com o esac, ou seja, 
case invertido.
funções 
nome_funcao () { 
comandos 
} 
function nome_funcao { 
comandos 
} 
pedir_nome () { 
echo -n "Digite seu nome: " 
read NOME 
} 
pedir_nome 
echo "Olá $NOME!"
Opções de linha de comando 
+ Variáveis especiais e parâmetros posicionais 
$0 → Nome do script 
$1-$n → Parâmetros passados à linha de comando 
$# → Número de parâmetros passados 
$* → Lista de parâmetros passados 
cut -d : -f 2 /etc/passwd 
# $0 = cut 
# $1 = -d 
# $2 = : 
# $3 = -f 
# $4 = 2 
# $5 = /etc/passwd 
# $# = 5 
# $* = -d : -f 2 /etc/passwd
Vamos ao primeiro exemplo! 
listando usuários 
https://github.com/hugomaiavieira/shellscript-scti2014
.bashrc
Alias (apelidos) 
alias ss="spring rspec" 
alias ll="ls -lah" 
alias ..='cd ..' 
# google chrome for mobile dev 
alias mobile_chrome="google-chrome  
--allow-file-access-from-files  
--disable-web-security  
--user-data-dir=$HOME/.google-chrome/mobile_dev"
Variáveis de ambiente 
$PATH 
$PS1 
$QQ_COISA
Vamos ao segundo exemplo! 
oh my gems! 
https://github.com/hugomaiavieira/shellscript-scti2014
autocompletar 
compgen e complete
compgem 
+ Lista de possíveis “completadas” 
compgen -W 'pedro mario maria joão mariana' mari
complete 
+ Disponibiliza e usa suas variáveis para funções de autocompletar 
COMP_LINE 
a linha de comando no momento 
COMP_WORDS 
lista de argumentos passados para o comando no momento 
COMP_CWORD 
o índice do argumento onde o cursor está no momento 
COMP_WORDBREAKS 
lista de caracteres separadores de palavras 
COMPREPLY 
um array contendo as possíveis “completadas”
Exemplo 
_nome() { 
local current=${COMP_WORDS[COMP_CWORD]} 
COMPREPLY=( $(compgen -W 'mario maria ana mariana' $current) ) 
} 
complete -F _nome nome 
Estamos dizendo ao comando complete que utilize a função _nome 
para modificar a variável COMPREPLY com as possíveis “completadas” 
para o comando nome 
current=${COMP_WORDS[COMP_CWORD]} 
Se estivermos digitando “nome mari” e apartarmos [TAB][TAB], 
o valor de current será “mari”
Referências 
http://www.novatec.com.br/livros/shellscript/ 
Shell Script Professinal – Aurélio Marinho Jargas 
http://www.tldp.org/LDP/abs/html/abs-guide.html 
Advanced Bash-Scripting Guide 
http://en.wikipedia.org/wiki/Shebang_(Unix) 
Sobre o hashbang 
http://goo.gl/INt07D 
Autocompletar no Bash

Introdução ao Shell Script (versão estendida)

  • 1.
    Introdução ao ShellScript (versão estendida) Hugo Maia Vieira @hugomaiavieira novembro de 2014 Esta obra é licenciada sob uma licença Creative Commons
  • 2.
    O que éShell Script? O que é shell? O que é script? scripts em shell == Shell Scritp ==
  • 3.
    O Shell, terminal,prompt, linha de comando
  • 4.
    Scripts executáveis (Unix) chmod +x arquivo Localização do interpretador: hashbang¹ (#!) #!/bin/sh ou #!/usr/bin/env sh ¹ http://en.wikipedia.org/wiki/Shebang_(Unix)
  • 5.
    Variáveis $ VARIAVEL='blabla bla' $ echo $VARIAVEL bla bla bla + Não pode haver espaços ao redor do igual + O comando local variáveis locais + O comando unset elimina a variável + É possível armazenar a saída de um comando usando o $(...): $ DATA=$(date +%x) $ echo $DATA 09-11-2011
  • 6.
    Expressões aritméticas +A construção utilizada para indicar uma expressão aritmética É $((...)). Sim, com 2 parênteses! $ echo $((5*8)) 40 $ SOMA=$((2+5+1)) $ echo $SOMA 8 $ RESPOTA=$((SOMA*2)) $ echo $RESPOSTA 16
  • 7.
    O comando test $ test EXPRESSÃO $ test [[ EXPRESSÃO ]] $ man test $ test "a" = "a" && echo "é igual!" é igual $ echo $? 0 $ [[ "a" = "b" ]] && echo "é igual!" $ echo $? 1 + Para a sintaxe usando colchetes, deve ter um espaço entre a expressão e os colchetes.
  • 8.
    if COMANDO then comandos elif COMANDO then comandos else comandos fi if + O if testa um comando e não uma condição. Porém, existe o comando test que testa condições. if [[ "a" -gt 25 ]]; then echo "é maior que 25" else echo "é menor que 25" fi + Fique ligado: o if é fechado com o fi, ou seja, if invertido.
  • 9.
    for for VARIAVELin LISTA do comandos done + O for percorre uma lista, pegando um elemento a cada iteração. echo 'Seu computador irá explodir em 5 segundos' for numero in cinco quatro três dois um do echo "$numero" sleep 1 done echo "BUUMMMM!!!"
  • 10.
    for + Umcomando muito útil para usar com o for é o seq, que gera uma sequência numérica. for numero in $(seq 5) + Outro comando muito útil para usar com o for é o cat: contador=0 for pais in $(cat dados.txt) do contador=$((contador+1)) echo "$contador: $pais" done
  • 11.
    while while COMANDO do comandos done numero=0 while test $numero -le 10 do numero=$((numero+1)) echo "Contando: $numero" done + Existem também o until, que têm as mesmas características do while. a única diferença é que ele faz o contrário.
  • 12.
    case case VARIAVELin caso1) comando; comando;; caso2) comando; comando;; *) comando;; esac case "$1" in -h | --help) echo "$MENSAGEM_DE_USO" ;; -V | --version) echo "1.0" ;; *) echo "Opção inválida: $1" ;; esac + Fique ligado: o case é fechado com o esac, ou seja, case invertido.
  • 13.
    funções nome_funcao (){ comandos } function nome_funcao { comandos } pedir_nome () { echo -n "Digite seu nome: " read NOME } pedir_nome echo "Olá $NOME!"
  • 14.
    Opções de linhade comando + Variáveis especiais e parâmetros posicionais $0 → Nome do script $1-$n → Parâmetros passados à linha de comando $# → Número de parâmetros passados $* → Lista de parâmetros passados cut -d : -f 2 /etc/passwd # $0 = cut # $1 = -d # $2 = : # $3 = -f # $4 = 2 # $5 = /etc/passwd # $# = 5 # $* = -d : -f 2 /etc/passwd
  • 15.
    Vamos ao primeiroexemplo! listando usuários https://github.com/hugomaiavieira/shellscript-scti2014
  • 16.
  • 17.
    Alias (apelidos) aliasss="spring rspec" alias ll="ls -lah" alias ..='cd ..' # google chrome for mobile dev alias mobile_chrome="google-chrome --allow-file-access-from-files --disable-web-security --user-data-dir=$HOME/.google-chrome/mobile_dev"
  • 18.
    Variáveis de ambiente $PATH $PS1 $QQ_COISA
  • 19.
    Vamos ao segundoexemplo! oh my gems! https://github.com/hugomaiavieira/shellscript-scti2014
  • 20.
  • 21.
    compgem + Listade possíveis “completadas” compgen -W 'pedro mario maria joão mariana' mari
  • 22.
    complete + Disponibilizae usa suas variáveis para funções de autocompletar COMP_LINE a linha de comando no momento COMP_WORDS lista de argumentos passados para o comando no momento COMP_CWORD o índice do argumento onde o cursor está no momento COMP_WORDBREAKS lista de caracteres separadores de palavras COMPREPLY um array contendo as possíveis “completadas”
  • 23.
    Exemplo _nome() { local current=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W 'mario maria ana mariana' $current) ) } complete -F _nome nome Estamos dizendo ao comando complete que utilize a função _nome para modificar a variável COMPREPLY com as possíveis “completadas” para o comando nome current=${COMP_WORDS[COMP_CWORD]} Se estivermos digitando “nome mari” e apartarmos [TAB][TAB], o valor de current será “mari”
  • 24.
    Referências http://www.novatec.com.br/livros/shellscript/ ShellScript Professinal – Aurélio Marinho Jargas http://www.tldp.org/LDP/abs/html/abs-guide.html Advanced Bash-Scripting Guide http://en.wikipedia.org/wiki/Shebang_(Unix) Sobre o hashbang http://goo.gl/INt07D Autocompletar no Bash