Este documento fornece uma introdução ao Shell Script, explicando o que é Shell e script, como criar e executar scripts, utilizando variáveis, expressões, estruturas de controle como if/else, for, case e funções. Também aborda autocompletar, alias, variáveis de ambiente e exemplos práticos.
1. Introdução ao
Shell Script
(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 ==
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='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
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 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!!!"
10. 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
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 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.
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 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
15. Vamos ao primeiro exemplo!
listando usuários
https://github.com/hugomaiavieira/shellscript-scti2014
17. 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"
21. compgem
+ Lista de possíveis “completadas”
compgen -W 'pedro mario maria joão mariana' mari
22. 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”
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/
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