Introdução ao Shell Script
(versão estendida)
Hugo Maia Vieira@hugomaiavieira
novembro de 2014Esta obra é licenciada sob uma licença
Creative Commons
O que é shell?
O que é script?
O que é Shell Script?
scripts em shell == Shell Scritp ==
O Shell, terminal, prompt, linha de comando
chmod +x arquivo
Localização do interpretador: hashbang¹ (#!)
Scripts executáveis (Unix)
#!/bin/sh
#!/usr/bin/env sh
ou
¹ http://en.wikipedia.org/wiki/Shebang_(Unix)
$ VARIAVEL='bla bla bla'$ echo $VARIAVELbla bla bla
Variáveis
+ Não pode haver espaços ao redor do igual
+ O comando unset elimina a variável
+ É possível armazenar a saída de um comando usando o $(...):
$ DATA=$(date +%x)$ echo $DATA09-11-2011
+ O comando local variáveis locais
$ echo $((5*8))40
$ SOMA=$((2+5+1))$ echo $SOMA8
$ RESPOTA=$((SOMA*2))$ echo $RESPOSTA16
Expressões aritméticas
+ A construção utilizada para indicar uma expressão aritmética É $((...)). Sim, com 2 parênteses!
$ test EXPRESSÃO$ test [[ EXPRESSÃO ]]
$ man test
$ test "a" = "a" && echo "é igual!"é igual$ echo $?0
$ [[ "a" = "b" ]] && echo "é igual!"$ echo $?1
O comando test
+ Para a sintaxe usando colchetes, deve ter um espaço entre a expressão e os colchetes.
if COMANDOthen comandos elif COMANDOthen comandoselse 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 VARIAVEL in LISTAdo comandos done
for
+ 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 umdo echo "$numero" sleep 1done 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=0for pais in $(cat dados.txt)do contador=$((contador+1)) echo "$contador: $pais"done
while COMANDOdo comandos done
while
numero=0while test $numero -le 10do 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 VARIAVEL in caso1) comando; comando;; caso2) comando; comando;; *) comando;;esac
case
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.
nome_funcao () { comandos }
funções
pedir_nome () { echo -n "Digite seu nome: " read NOME}
pedir_nomeecho "Olá $NOME!"
function nome_funcao { comandos }
cut -d : -f 2 /etc/passwd
# $0 = cut# $1 = -d# $2 = :# $3 = -f# $4 = 2# $5 = /etc/passwd# $# = 5# $* = -d : -f 2 /etc/passwd
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→
Vamos ao primeiro exemplo!
https://github.com/hugomaiavieira/shellscript-scti2014
listando usuários
.bashrc
alias ss="spring rspec"
alias ll="ls -lah"
alias ..='cd ..'
# google chrome for mobile devalias mobile_chrome="google-chrome \ --allow-file-access-from-files \ --disable-web-security \ --user-data-dir=$HOME/.google-chrome/mobile_dev"
Alias (apelidos)
$PATH
$PS1
$QQ_COISA
Variáveis de ambiente
Vamos ao segundo exemplo!
https://github.com/hugomaiavieira/shellscript-scti2014
oh my gems!
autocompletar
compgen e complete
compgen -W 'pedro mario maria joão mariana' mari
compgem
+ Lista de possíveis “completadas”
COMP_LINEa linha de comando no momento
COMP_WORDSlista de argumentos passados para o comando no momento
COMP_CWORDo índice do argumento onde o cursor está no momento
COMP_WORDBREAKSlista de caracteres separadores de palavras
COMPREPLYum array contendo as possíveis “completadas”
complete+ Disponibiliza e usa suas variáveis para funções de autocompletar
current=${COMP_WORDS[COMP_CWORD]}
Exemplo
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
_nome() { local current=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W 'mario maria ana mariana' $current) )}complete -F _nome nome
Se estivermos digitando “nome mari” e apartarmos [TAB][TAB], o valor de current será “mari”
Referênciashttp://www.novatec.com.br/livros/shellscript/
Shell Script Professinal – Aurélio Marinho Jargas
http://www.tldp.org/LDP/abs/html/abs-guide.htmlAdvanced Bash-Scripting Guide
http://en.wikipedia.org/wiki/Shebang_(Unix)Sobre o hashbang
http://goo.gl/INt07DAutocompletar no Bash