Transcript
Page 1: Tutorial Shell Script

Introdução ao Shell Script

Aurélio Marinho Jargas

http://aurelio.net

Page 2: Tutorial Shell Script

ÍndiceSobre o curso.......................................................................................................................1

Apresentação........................................................................................................................2O que é o shell............................................................................................................2Shell script...................................................................................................................3Antes de começar........................................................................................................3

O primeiro shell script.........................................................................................................4Passos para criar um shell script.................................................................................4Problemas na execução do script................................................................................5

O primeiro shell script (melhorado)....................................................................................6Melhorar a saída na tela..............................................................................................6Interagir com o usuário................................................................................................6Melhorar o código do script.........................................................................................7

Rebobinando a fita...............................................................................................................8Variáveis......................................................................................................................8Detalhes sobre os comandos......................................................................................8O comando test.........................................................................................................10Tarefa: script que testa arquivos...............................................................................11

Conceitos mais avançados...............................................................................................12Recebimento de opções e parâmetros......................................................................12Expressões aritméticas..............................................................................................12If, for e while..............................................................................................................13

Exercícios...........................................................................................................................15

Mais informações...............................................................................................................18

Respostas dos exercícios.................................................................................................19testa-arquivos............................................................................................................19relacao.sh..................................................................................................................19zerador.sh..................................................................................................................19substring.sh...............................................................................................................20juntatudo.sh...............................................................................................................20users.sh.....................................................................................................................20shells.sh.....................................................................................................................20parametros.sh............................................................................................................20

Introdução ao Shell Script - Aurélio Marinho Jargas

i

Page 3: Tutorial Shell Script

Sobre o curso

NomeIntrodução a Shell Scripts

InstrutorAurélio Marinho Jargas (http://aurelio.net)

ObjetivoEnsinar aos alunos todos os conceitos necessários para poderem fazer sozinhosscripts simples em shell.

Pré-RequisitosNoções básicas de informática e operação do sistema pela linha de comando. Édesejado, porém não obrigatório, noções básicas de programação.

Público AlvoDesenvolvedores, administradores de sistemas, programadores e interessados emgeral.

Duração8 horas

1

Page 4: Tutorial Shell Script

Apresentação

O que é o shell

O shell é o "prompt" da linha de comando do Unix e Linux, é o servo que recebe oscomandos digitados pelo usuário e os executa.

O shell é aquele que aparece logo após digitar-se a senha do usuário e entrar na telapreta. Ou na interface gráfica, ao clicar no ícone do Xterm, rxvt, Terminal ou Console.

localhost login: root Password:

Last login: Fri Apr 16 01:57:28 on tty5 [root@localhost root]# _

Ali está o shell, esperando ansiosamente por algum comando para ele poder executar.Essa é a sua função: esperar e executar. Cada comando digitado é lido, verificado,interpretado e enviado ao sistema operacional para ser de fato executado.

No Mac OS X, o shell está em Aplicativos > Utilitários > Terminal. No Windows épreciso instalá-lo com o Cygwin.

Funcionando como uma ponte, o shell é a ligação entre o usuário e o kernel. O kernel équem acessa os equipamentos (hardware) da máquina, como disco rígido, placa de vídeoe modem. Por exemplo, para o usuário ler um arquivo qualquer, toda esta hierarquia éseguida:

USUÁRIO --> SHELL --> KERNEL --> DISCO RÍGIDO

Para os usuários do Windows, é fácil pensar no shell como um MSDOS melhorado. Aoinvés do C:\> aparece um [root@localhost root]#, mas o funcionamento é similar. Bastadigitar um comando, suas opções e apertar a ENTER que ele será executado. O comandodeve estar no PATH, mensagens de aviso são mandadas para a tela e Ctrl+C interrompe ofuncionamento. Isso tudo é igual em ambos.

Mas o shell é muito mais poderoso que seu primo distante. Além dos comandos básicospara navegar entre diretórios e manipular arquivos, ele também possui todas as estruturasde uma linguagem de programação, como IF, FOR, WHILE, variáveis e funções. Com isso,também é possível usar o shell para fazer scripts e automatizar tarefas.

Este será o nosso foco: scripts em shell.

2

Page 5: Tutorial Shell Script

Shell script

Um script é um arquivo que guarda vários comandos e pode ser executado sempre quepreciso. Os comandos de um script são exatamente os mesmos que se digita no prompt, étudo shell.

Por exemplo, se de tempos em tempos você quer saber informações do sistema comohorário, ocupação do disco e os usuários que estão logados, é preciso digitar trêscomandos:

[root@localhost root]# date [root@localhost root]# df [root@localhost root]# w

É melhor fazer um script chamado "sistema" e colocar estes comandos nele. O conteúdodo arquivo "sistema" seria o seguinte:

#!/bin/bash date df w

E para chamar este script, basta agora executar apenas um comando:

[root@localhost root]# sistema

Isso é um shell script. Um arquivo de texto que contém comandos do sistema e pode serexecutado pelo usuário.

Antes de começar

Se você está acessando o sistema como usuário administrador (root), saia e entre comoum usuário normal. É muito perigoso estudar shell usando o superusuário, você podedanificar o sistema com um comando errado.

Se você não tem certeza qual o seu usuário, use o comando "whoami" parasaber

Como o prompt de usuário normal é diferente para cada um, nos exemplos seguintes seráusado "prompt$" para indicar o prompt da linha de comando.

Introdução ao Shell Script - Aurélio Marinho Jargas

3

Page 6: Tutorial Shell Script

O primeiro shell script

O primeiro shell script a fazer será o "sistema" do exemplo anterior, de simplesmente juntartrês comandos em um mesmo script.

Passos para criar um shell script

1. Escolher um nome para o script

Já temos um nome: sistema.

Use apenas letras minúsculas e evite acentos, símbolos e espaço em branco

2. Escolher o diretório onde colocar o script

Para que o script possa ser executado de qualquer parte do sistema, mova-o para umdiretório que esteja no seu PATH. Para ver quais são estes diretórios, use o comando:

echo $PATH

Se não tiver permissão de mover para um diretório do PATH, deixe-o dentro deseu diretório pessoal ($HOME).

3. Criar o arquivo e colocar nele os comandos

Use o nano, VI ou outro editor de textos de sua preferência para colocar todos oscomandos dentro do arquivo.

4. Colocar a chamada do shell na primeira linha

A primeira linha do script deve ser:

#!/bin/bash

Para que ao ser executado, o sistema saiba que é o shell quem irá interpretar estescomandos.

5. Tornar o script um arquivo executável

Use o seguinte comando para que seu script seja reconhecido pelo sistema como umcomando executável:

chmod +x sistema

4

Page 7: Tutorial Shell Script

Problemas na execução do script

"Comando não encontrado"

O shell não encontrou o seu script.

Verifique se o comando que você está chamando tem exatamente o mesmo nomedo seu script. Lembre-se que no Unix/Linux as letras maiúsculas e minúsculas sãodiferentes, então o comando "SISTEMA" é diferente do comando "sistema".

Caso o nome esteja correto, verifique se ele está no PATH do sistema. O comando"echo $PATH" mostra quais são os diretórios conhecidos, mova seu script paradentro de um deles, ou chame-o passando o caminho completo.

Se o script estiver no diretório corrente, chame-o com um "./" na frente, assim:

prompt$ ./sistema

Caso contrário, especifique o caminho completo desde o diretório raiz:

prompt$ /tmp/scripts/sistema

"Permissão Negada"

O shell encontrou seu script, mas ele não é executável.

Use o comando "chmod +x seu-script" para torná-lo um arquivo executável.

"Erro de Sintaxe"

O shell encontrou e executou seu script, porém ele tem erros.

Um script só é executado quando sua sintaxe está 100% correta. Verifique os seuscomandos, geralmente o erro é algum IF ou aspas que foram abertos e não foramfechados. A própria mensagem informa o número da linha onde o erro foiencontrado.

Introdução ao Shell Script - Aurélio Marinho Jargas

5

Page 8: Tutorial Shell Script

O primeiro shell script (melhorado)

Nesse ponto, você já sabe o básico necessário para fazer um script em shell do zero eexecutá-lo. Mas apenas colocar os comandos em um arquivo não torna este script útil.Vamos fazer algumas melhorias nele para que fique mais compreensível.

Melhorar a saída na tela

Executar os três comandos seguidos resulta em um bolo de texto na tela, misturando asinformações e dificultando o entendimento. É preciso trabalhar um pouco a saída do script,tornando-a mais legível.

O comando "echo" serve para mostrar mensagens na tela. Que tal anunciar cada comandoantes de executá-lo?

#!/bin/bash echo "Data e Horário:" date echo echo "Uso do disco:" df echo echo "Usuários conectados:" w

Para usar o echo, basta colocar o texto entre "aspas". Se nenhum texto for colocado, umalinha em branco é mostrada.

Interagir com o usuário

Para o script ficar mais completo, vamos colocar uma interação mínima com o usuário,pedindo uma confirmação antes de executar os comandos.

#!/bin/bash echo "Vou buscar os dados do sistema. Posso continuar? [sn] " read RESPOSTA test "$RESPOSTA" = "n" && exit echo "Data e Horário:" date echo echo "Uso do disco:" df echo echo "Usuários conectados:" w

O comando "read" leu o que o usuário digitou e guardou na variável RESPOSTA. Logo emseguida, o comando "test" verificou se o conteúdo dessa variável era "n". Se afirmativo, o

6

Page 9: Tutorial Shell Script

comando "exit" foi chamado e o script foi finalizado. Nessa linha há vários detalhesimportantes:

O conteúdo da variável é acessado colocando-se um cifrão "$" na frente• O comando test é útil para fazer vários tipos de verificações em textos e arquivos• O operador lógico "&&", só executa o segundo comando caso o primeiro tenha sidoOK. O operador inverso é o "||"

Melhorar o código do script

Com o tempo, o script vai crescer, mais comandos vão ser adicionados e quanto maior,mais difícil encontrar o ponto certo onde fazer a alteração ou corrigir algum erro.

Para poupar horas de estresse, e facilitar as manutenções futuras, é preciso deixar ocódigo visualmente mais agradável e espaçado, e colocar comentários esclarecedores.

#!/bin/bash # sistema - script que mostra informações sobre o sistema # Autor: Fulano da Silva

# Pede uma confirmação do usuário antes de executar echo "Vou buscar os dados do sistema. Posso continuar? [sn] " read RESPOSTA

# Se ele digitou 'n', vamos interromper o script test "$RESPOSTA" = "n" && exit

# O date mostra a data e a hora correntes echo "Data e Horário:" date echo

# O df mostra as partições e quanto cada uma ocupa no disco echo "Uso do disco:" df echo

# O w mostra os usuários que estão conectados nesta máquina echo "Usuários conectados:" w

Basta iniciar a linha com um "#" e escrever o texto do comentário em seguida. Estas linhassão ignoradas pelo shell durante a execução. O cabeçalho com informações sobre o scripte seu autor também é importante para ter-se uma visão geral do que o script faz, semprecisar decifrar seu código.

Também é possível colocar comentários no meio da linha # como este

Introdução ao Shell Script - Aurélio Marinho Jargas

7

Page 10: Tutorial Shell Script

Rebobinando a fita

Agora é hora de fixar alguns dos conceitos vistos no script anterior.

Variáveis

As variáveis são a base de qualquer script. É dentro delas que os dados obtidos durante aexecução do script serão armazenados. Para definir uma variável, basta usar o sinal deigual "=" e para ver seu valor, usa-se o "echo":

prompt$ VARIAVEL="um dois tres"prompt$ echo $VARIAVEL

um dois tresprompt$ echo $VARIAVEL $VARIAVEL

um dois tres um dois tresprompt$

Não podem haver espaços ao redor do igual "="

Ainda é possível armazenar a saída de um comando dentro de uma variável. Ao invés deaspas, o comando deve ser colocado entre "$(...)", veja:

prompt$ HOJE=$(date)prompt$ echo "Hoje é: $HOJE"

Hoje é: Sáb Abr 24 18:40:00 BRT 2004prompt$ unset HOJEprompt$ echo $HOJE

prompt$

E finalmente, o comando "unset" apaga uma variável.

Para ver quais as variáveis que o shell já define por padrão, use o comando"env"

Detalhes sobre os comandos

Diferente de outras linguagens de programação, o shell não usa os parênteses paraseparar o comando de seus argumentos, mas sim o espaço em branco. O formato de umcomando é sempre:

COMANDO OPÇÕES PARÂMETROS

O comando "cat" mostra o conteúdo de um arquivo. O comando "cat -n sistema" mostra onosso script, com as linhas numeradas. O "-n" é a opção para o comando, que o instrui anumerar linhas, e "sistema" é o último argumento, o nome do arquivo.

8

Page 11: Tutorial Shell Script

O "read" é um comando do próprio shell, já o "date"" é um executável do sistema. Dentrode um script, não faz diferença usar um ou outro, pois o shell sabe como executar ambos.Assim, toda a gama de comandos disponíveis no Unix/Linux pode ser usada em scripts!

Há vários comandos que foram feitos para serem usados com o shell, são comoferramentas. Alguns deles:

Comando Função Opções úteis

cat Mostra arquivo -n, -s

cut Extrai campo -d -f, -c

date Mostra data -d, +'...'

find Encontra arquivos -name, -iname, -type f, -exec

grep Encontra texto -i, -v, -r, -qs, -w -x

head Mostra Início -n, -c

printf Mostra texto nenhuma

rev Inverte texto nenhuma

sed Edita texto -n, s/isso/aquilo/, d

seq Conta Números -s, -f

sort Ordena texto -n, -f, -r, -k -t, -o

tail Mostra Final -n, -c, -f

tr Transforma texto -d, -s, A-Z a-z

uniq Remove duplicatas -i, -d, -u

wc Conta Letras -c, -w, -l, -L

Use "man comando" ou "comando --help" para obter mais informações sobrecada um deles.

E o melhor, em shell é possível combinar comandos, aplicando-os em seqüência, paraformar um comando completo. Usando o pipe "|" é possível canalizar a saída de umcomando diretamente para a entrada de outro, fazendo uma cadeia de comandos.Exemplo:

prompt$ cat /etc/passwd | grep root | cut -c1-10 root:x:0:0 operator:x

prompt$

Introdução ao Shell Script - Aurélio Marinho Jargas

9

Page 12: Tutorial Shell Script

O cat mostra o arquivo todo, o grep pega essa saída e extrai apenas as linhas que contêma palavra "root" e o cut por sua vez, somente nessas linhas que o grep achou, extrai os 10primeiros caracteres. Isso funciona como uma estação de tratamento de água, onde elaentra suja, vai passando por vários filtros que vão tirando as impurezas e sai limpa no final.

E por fim, também é possível redirecionar a saída de um comando para um arquivo aoinvés da tela, usando o operador ">". Para guardar a saída do comando anterior no arquivo"saida", basta fazer:

prompt$ cat /etc/passwd | grep root | cut -c1-10 > saidaprompt$ cat saida

root:x:0:0 operator:xprompt$

Cuidado! Shell é tão legal que vicia!

O comando test

O canivete suíço dos comandos do shell é o "test", que consegue fazer vários tipos detestes em números, textos e arquivos. Ele possui várias opções para indicar que tipo deteste será feito, algumas delas:

Testes em variáveis Testes em arquivos

-lt Núm. é menor que (LessThan) -d É um diretório

-gt Núm. é maior que (GreaterThan) -f É um arquivo normal

-le Núm. é menor igual (LessEqual) -r O arquivo tem permissão de leitura

-ge Núm. é maior igual (GreaterEqual) -s O tamanho do arquivo é maior que zero

-eq Núm. é igual (EQual) -w O arquivo tem permissão de escrita

-ne Núm. é diferente (NotEqual) -nt O arquivo é mais recente (NewerThan)

= String é igual -ot O arquivo é mais antigo (OlderThan)

!= String é diferente -ef O arquivo é o mesmo (EqualFile)

-n String é não nula -a E lógico (AND)

-z String é nula -o OU lógico (OR)

Introdução ao Shell Script - Aurélio Marinho Jargas

10

Page 13: Tutorial Shell Script

Tarefa: script que testa arquivos

Tente fazer o script "testa-arquivos", que pede ao usuário para digitar um arquivo e testase este arquivo existe. Se sim, diz se é um arquivo ou um diretório. Exemplo de uso:

prompt$ testa-arquivos Digite o arquivo: /naoexiste O arquivo '/naoexiste' não foi encontrado

prompt$ testa-arquivos Digite o arquivo: /tmp /tmp é um diretório

prompt$ testa-arquivos Digite o arquivo: /etc/passwd /etc/passwd é um arquivo

prompt$

Introdução ao Shell Script - Aurélio Marinho Jargas

11

Page 14: Tutorial Shell Script

Conceitos mais avançados

Até agora vimos o básico, o necessário para se fazer um script de funcionalidade mínima.A seguir, conceitos novos que ampliarão as fronteiras de seus scripts!

Recebimento de opções e parâmetros

Assim como os comandos do sistema que possuem e opções e parâmetros, os scriptstambém podem ser preparados para receber dados via linha de comando.

Dentro do script, algumas variáveis especiais são definidas automaticamente, em especial,"$1" contém o primeiro argumento recebido na linha de comando, "$2" o segundo, e assimpor diante. Veja o script "argumentos":

#!/bin/sh # argumentos - mostra o valor das variáveis especiais

echo "O nome deste script é: $0" echo "Recebidos $# argumentos: $*" echo "O primeiro argumento recebido foi: $1" echo "O segundo argumento recebido foi: $2"

Ele serve para demonstrar o conteúdo de algumas variáveis especiais, acompanhe:

prompt$ ./argumentos um dois três O nome deste script é: ./argumentos Recebidos 3 argumentos: um dois três O primeiro argumento recebido foi: um O segundo argumento recebido foi: dois

O acesso é direto, basta referenciar a variável que o valor já estará definido. Assim épossível criar scripts que tenham opções como --help, --version e outras.

Expressões aritméticas

O shell também sabe fazer contas. A construção usada para indicar uma expressãoaritmética é "$((...))", com dois parênteses.

prompt$ echo $((2*3)) 6prompt$ echo $((2*3-2/2+3))

8prompt$ NUM=44prompt$ echo $((NUM*2))

88prompt$ NUM=$((NUM+1))prompt$ echo $NUM

45

12

Page 15: Tutorial Shell Script

If, for e while

Assim como qualquer outra linguagem de programação, o shell também tem estruturaspara se fazer condicionais e loop. As mais usadas são if, for e while.

if COMANDO for VAR in LISTA while COMANDO then do do comandos comandos comandos else done done comandos fi

Diferente de outras linguagens, o if testa um comando e não uma condição. Porém como jáconhecemos qual o comando do shell que testa condições, é só usá-lo em conjunto com oif. Por exemplo, para saber se uma variável é maior ou menor do que 10 e mostrar umamensagem na tela informando:

if test "$VARIAVEL" -gt 10 then echo "é maior que 10" else echo "é menor que 10" fi

Há um atalho para o test , que é o comando [. Ambos são exatamente o mesmo comando,porém usar o [ deixa o if mais parecido com o formato tradicional de outras linguagens:

if [ "$VARIAVEL" -gt 10 ] then echo "é maior que 10" else echo "é menor que 10" fi

Se usar o [, também é preciso fechá-lo com o ], e sempre devem ter espaços aoredor. É recomendado evitar esta sintaxe para diminuir suas chances de erro.

Já o while é um laço que é executado enquanto um comando retorna OK. Novamente otest é bom de ser usado. Por exemplo, para segurar o processamento do script enquantoum arquivo de lock não é removido:

while test -f /tmp/lock do echo "Script travado..." sleep 1 done

Introdução ao Shell Script - Aurélio Marinho Jargas

13

Page 16: Tutorial Shell Script

E por fim, o for percorre uma lista de palavras, pegando uma por vez:

for numero in um dois três quatro cinco do echo "Contando: $numero" done

Uma ferramenta muito útil para usar com o for é o seq, que gera uma seqüência numérica.Para fazer o loop andar 10 passos, pode-se fazer:

for passo in $(seq 10)

O mesmo pode ser feito com o while, usando um contador:

i=0 while test $i -le 10 do i=$((i+1)) echo "Contando: $i" done

E temos ainda o loop infinito, com condicional de saída usando o "break¨:

while : do if test -f /tmp/lock then echo "Aguardando liberação do lock..." sleep 1 else break fi done

Introdução ao Shell Script - Aurélio Marinho Jargas

14

Page 17: Tutorial Shell Script

Exercícios

A melhor parte finalmente chegou, agora é a sua vez de se divertir. Seguem algunsexercícios que podem ser resolvidos usando o que foi aprendido até aqui.

Alguns exigirão pesquisa e necessitarão de algumas ferramentas que foram apenascitadas, mas não aprendidas. O shelleiro também tem que aprender a se virar sozinho!

Exercício 1 - relacao.sh

Recebe dois números como parâmetro e mostra a relação entre eles. Exemplo:

prompt$ ./relacao.sh 3 5 3 é menor que 5prompt$ ./relacao.sh 5 3

5 é maior que 3prompt$ ./relacao.sh 5 5

5 é igual a 5prompt$

Exercício 2 - zerador.sh

Recebe um número como parâmetro e o diminui até chegar a zero, mostrando natela cada passo, em uma mesma linha. Exemplo:

prompt$ ./zerador.sh 5 5 4 3 2 1 0prompt$ ./zerador.sh 10

10 9 8 7 6 5 4 3 2 1 0prompt$

Exercício 3 - substring.sh

Recebe duas palavras como parâmetro e verifica se a primeira palavra está contidadentro da segunda. Só mostra mensagem informativa em caso de sucesso, docontrário não mostra nada. Exemplo:

prompt$ ./substring.sh ana banana ana está contida em bananaprompt$ ./substring.sh banana mariaprompt$ ./substring.sh bananaprompt$ ./substring.shprompt$

Pesquise sobre o comando grep

15

Page 18: Tutorial Shell Script

Exercício 4 - juntatudo.sh

Mostra na tela "grudados" todos os parâmetros recebidos na linha de comando,como uma única palavra. Exemplo:

prompt$ ./juntatudo.sh a b c d e f verde azul abcdefverdeazulprompt$

Pesquise sobre o comando tr

Exercício 5 - users.sh

Do arquivo /etc/passwd, mostra o usuário e o nome completo de cada usuário dosistema (campos 1 e 5) separados por um TAB. Exemplo:

prompt$ ./users.sh ftp FTP User nobody Nobody named Domain name server xfs X Font Server mysql MySQL server aurelio Aurelio Marinho Jargasprompt$

Pesquise sobre o comando cut

Exercício 6 - shells.sh

Do arquivo /etc/passwd, mostra todos os shells (último campo) que os usuáriosusam. Não mostrar linhas repetidas. Exemplo:

prompt$ ./shells.sh /bin/bash /bin/false /bin/sync /sbin/halt /sbin/shutdownprompt$

Pesquise sobre o comando uniq

Introdução ao Shell Script - Aurélio Marinho Jargas

16

Page 19: Tutorial Shell Script

Exercício 7 - parametros.sh

Mostra na tela todos os parâmetros recebidos na linha de comando, contando-os.Exemplo:

prompt$ ./parametros.sh a b c d e f Parâmetro 1: a Parâmetro 2: b Parâmetro 3: c Parâmetro 4: d Parâmetro 5: e Parâmetro 6: fprompt$

Pesquise sobre o comando shift

Introdução ao Shell Script - Aurélio Marinho Jargas

17

Page 20: Tutorial Shell Script

Mais informações

Livro Programação Shell LinuxAutoria de Julio Cezar Neves, Editora Brasport, ISBN 85-7452-118-3

Livro BASH - Guia de Consulta RápidaAutoria de Joel Saade, Editora Novatec, ISBN 85-7522-006-3

Lista de discussão nacional sobre Shell Scripthttp://br.groups.yahoo.com/group/shell-script

Página do instrutor sobre Shell Script, com links para vários outros materiaishttp://aurelio.net/shell

18

Page 21: Tutorial Shell Script

Respostas dos exercícios

Resista à tentação de olhar as respostas antes de tentar fazer os exercícios! É na práticaque se consolida os conhecimentos aprendidos, não pule este passo. Seja forte, insista,não desista!

testa-arquivos

#!/bin/bash

echo -n "Digite o arquivo: " read ARQUIVO

test -d "$ARQUIVO" && echo "$ARQUIVO é um diretório" test -f "$ARQUIVO" && echo "$ARQUIVO é um arquivo"

test -f "$ARQUIVO" -o -d "$ARQUIVO" || echo "O arquivo '$ARQUIVO' não foi encontrado"

echo

relacao.sh

#!/bin/bash

if test $1 -eq $2 then echo "$1 é igual a $2" elif test $1 -lt $2 then echo "$1 é menor que $2" else echo "$1 é maior que $2" fi

zerador.sh

#!/bin/bash

i=$1 while test $i -ge 0 do echo -n "$i " i=$((i-1)) done echo

19

Page 22: Tutorial Shell Script

substring.sh

#!/bin/bash

test $# -ne 2 && exit

echo $2 | grep -qs $1 && echo "$1 está contida em $2"

juntatudo.sh

#!/bin/bash

echo $* | tr -d ' '

users.sh

#!/bin/bash

cat /etc/passwd | cut -d : -f 1,5 | tr : '\t'

shells.sh

#!/bin/bash cat /etc/passwd | cut -d : -f 7 | sort | uniq

parametros.sh

#!/bin/bash

i=0 while test "$1" do i=$((i+1)) echo "Parâmetro $i: $1" shift done

Introdução ao Shell Script - Aurélio Marinho Jargas

20

Page 23: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programacao em Shell Script

Kaio Rafael de Souza Barbosa, M.Sc

Universidade Federal do Amazonas - UFAME-mail: [email protected]

16 de outubro de 2010

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 24: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Sumario

1 Introducao

2 Comandos basicos

3 Interpretador de Comandos

4 Programando em Shell

5 Atribuicao de variaveisInterpolacao de variaveis

6 Teste de condicionalCase

7 Controles de lacosControles de lacos: while

8 Funcoes

9 BonusKaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 25: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programacao em Shell Scripting

Porque programar em linha de comando se o sistema ofereceambientes graficos para resolucao de atividades?

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 26: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programacao em Shell Scripting

Automatizacao de atividades

Administracao de sistemas

Otimizar a execucao de uma aplicacao

Desenvolver aplicativos

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 27: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programacao em Shell Scripting

O que e Programacao em Shell Scripting?

Um programa em Shell Scripting e um conjunto de comandosinternos e funcionalidades da linguagem que permitem ao usuariodesenvolver aplicacoes para resolucao de um determinadoproblema.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 28: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Comandos basicos

A tabela a seguir apresenta os comandos basicos para criacao deum shell scripting.

Comando Descricaols Lista o conteudo de um diretoriocd Entra/Muda do diretorio atualpwd Imprime o nome do diretorio atualecho Imprime uma linha do terminalcat Concatena arquivo e imprime uma saıdacut Remove secoes de cada linha do arquivowc Imprime quantas linhas, palavras e bytes tem no arquivo

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 29: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Comandos basicos

Algumas dicas importantes:

Os comandos sao sensıveis em caso de letras maiuscula ouminuscula, isso significa que o comando ls difere do comandoLs.

E possıvel utilizar o resultado de um comando para alimentarum outro como entrada.

Um comando novo pode ser criado a partir da combinacao dedois ou mais comandos.

Quando um comando e executado com sucesso, nenhumamensagem e apresentada **

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 30: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Comandos basicos

Exemplo: Saber a localizacao atual do usuario.

$ pwd/home/erin

Exemplo: Quantas linhas possuem o arquivo /etc/passwd.

$ cat /etc/passwd | wc -l44

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 31: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpretador de Comandos

Interpretador de Comandos

O interpretador de comandos analisa e processa os comandos quesao enviados ao sistema operacional. Por exemplo, o comando lsacessa as chamadas de sistema (system calls) para manipulacao deentrada e saıda.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 32: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpretador de Comandos

A Figura abaixo ilustra a arquitetura de um sistema decomputador.

Figura: Shell em uma arquitetura de um sistema de computador.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 33: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpretador de Comandos

Para atender diferente usuarios do sistema, existem variacoes deShells disponıveis no Linux. O arquivo /etc/shells indica quaisinterpretadores de comando estao instalados.

Shell Descricaobash Shell moderno do Linux, baseado no antigo Bourn Shell (sh)ksh Korn Shell estende todas as funcionalidades do shtcsh Shell que incorpora elementos da linguagem de programacao Czsh Shell que incorpora recursos do bash, tcsh e ksh

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 34: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpretador de Comandos

A lista de interpretadores instalados no sistema pode seridentificada pela leitura do arquivo /etc/shells. Segue oexemplo:

$ cat /etc/shells/bin/csh/bin/sh/usr/bin/es/usr/bin/ksh/bin/ksh/usr/bin/rc/usr/bin/tcsh/bin/tcsh/bin/bash

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 35: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programando em Shell

Ferramentas para desenvolver os scripts:

Shell

Editor de textos favoritos

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 36: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programando em Shell

Figura: Codigo fonte do programa ”Ola Mundo”.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 37: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Programando em Shell

Invocando um script

Figura: Invocacao do programa ”Ola Mundo”.Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 38: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Atribuicao de variaveis

Uma variavel e uma sequencia de caracteres dos quais e possıvelatribuir valores. A declaracao de uma variavel no Shell eidentificada quando o sinal de igualdade (=) e encontrado. Oexemplo a seguir declara duas variaveis, CURSO e ALUNO, e imprimeseu conteudo.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 39: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Atribuicao de variaveis

Exemplo:

$ cat -n variaveis.sh1 #!/bin/bash23 CURSO="Programacao em Shell Scripting"4 ALUNO="erin"56 echo "$ALUNO, voce esta no curso de: $CURSO"

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 40: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Atribuicao de variaveis

A execucao do script variaveis.sh esta descrita abaixo.

$ bash variaveis.sherin, voce esta no curso de: Programacao em Shell Scripting

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 41: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Interpolacao de variaveis

A interpolacao de variaveis avalia como sera a substituicao davariavel. Por exemplo, ao utilizar echo $ALUNO o conteudo davariavel ALUNO foi impresso.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 42: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Interpolacao de variaveis

E importante observar com cuidado alguns caso de interpolacao devariaveis.

Aspas dupla - Quando um caractere especial e observadoentre aspas dupla, o Shell ignora seu significado, com excecaodo cifrao ($), crase ( ` ), barra invertida (\).

Aspas simples - Quando um caractere especial e observadoentre aspas simples, o Shell ignora seu significado, semexcecao.

Crase - Utilizando quando e necessario executar um comandodo sistema. Este tipo de substituicao tambem e chamadasubstituicao de comando.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 43: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Interpolacao de variaveis

Interpolacao de variaveis

Exemplo:

$ cat -n variaveis2.sh1 #!/bin/bash23 COMANDO=$(ls /etc | wc -l)4 USUARIO="Erin"56 echo "$USUARIO, existem $COMANDO diretorios no /etc"

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 44: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

O condicional se (if) avalia se uma condicao e verdadeira ou falsa.Em termos gerais, a expressao if pode ser expressa da seguinteforma:

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 45: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

if [ TESTE-CONDICIONAL ]then

COMANDOSfi

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 46: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

Exemplo:

$ cat -n condicionalif.sh

1 #!/bin/bash

2

3 VALOR1=10

4 VALOR2=10

5

6 if [ $VALOR1 -eq $VALOR2 ]

7 then

8 echo "O valor: $VALOR1 e’ igual ao valor: $VALOR2"

9 fi

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 47: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

O Shell possui alguns recursos interessantes para avaliacao decondicionais. Por exemplo, e possıvel testar se um arquivo ou umdiretorio existe, se o usuario tem acesso de leitura no arquivo ou seo arquivo e uma ligacao (link) simbolica.

Expressao Significado[ -a Arquivo ] Avalia se o arquivo existe[ -b Arquivo ] Avalia se o arquivo existe e e um arquivo de bloco[ -w Arquivo ] Avalia se o arquivo existe e possui permissao de escrita[ -x Arquivo ] Avalia se o arquivo existe e possui permissao de execucao[ Arq1 -nt Arq2 ] Avalia se o arquivo (Arq1) e mais recente que Arq2

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 48: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

No caso de comparacao de strings e necessario utilizar outrosoperadores. Por exemplo, o codigo abaixo ilustra a comparacaoentre dois strings.

$ cat -n condicionalif2.sh

1 #!/bin/bash

2

3 NOME1="Erin"

4 NOME2="ERIn"

5

6 if [ $NOME1 == $NOME2 ]

7 then

8 echo "Strings iguais..."

9 fi

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 49: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional

O Shell estende o if caso o resultado nao seja verdade. Em outraspalavras, e possıvel avaliar condicoes com if-else. O exemplo abaixoilustra um teste condicional quando o resultado nao e verdadeiro.

cat -n condicionalif.sh

1 #!/bin/bash

2

3 NOME1="Erin"

4 NOME2="ERIn"

5

6 if [ $NOME1 == $NOME2 ]

7 then

8 echo "Strings iguais..."

9 else

10 echo "String sao diferentes"

11 fi

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 50: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional: case

O comando case e utilizado para deixar o codigo mais legıvel, pois,o excesso de condicionais if prejudicam o entendimento do codigo.O exemplo abaixo ilustra o emprego do comando case.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 51: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Case

Teste de condicional: case

$ cat -n condicionalcase.sh

1 #!/bin/bash

2 VALOR=4

5 case $VALOR in

6 1)

7 echo "Valor igual a 1" ;;

8 2)

9 echo "Valor igual a 2" ;;

10 3)

11 echo "Valor igual a 3" ;;

12 4)

13 echo "Valor igual a 4";;

14 *)

15 echo "Nao achei o valor";;

16 esac

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 52: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Controles de lacos: while

Controles de lacos: for

Os controladores de lacos em Shell sao utilizados para realizaratividades repetitivas. Por exemplo, e possıvel combinar o laco forno terminal para criar uma sequencia de arquivos vazios. O codigoabaixo ilustra essa situacao.

$ for VAR in $(seq 0 9); do touch arquivo_$VAR; done$ lsarquivo_0 arquivo_2 arquivo_4 arquivo_6 arquivo_8arquivo_1 arquivo_3 arquivo_5 arquivo_7 arquivo_9

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 53: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Controles de lacos: while

Controles de lacos: for

O que sera impresso no terminal?

$ cat -n lacofor.sh1 #!/bin/bash23 for INDICE in laranja maca pera uva4 do5 echo "Quando custa: $INDICE ?"6 done

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 54: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Controles de lacos: while

Controles de lacos: while

O comando de laco while e executado ate que uma condicao sejarealizada. E um dos comandos de controle de lacos mais simplesde ser empregado no Shell. Sua sintaxe pode ser denotada daseguinte forma.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 55: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Controles de lacos: while

Controles de lacos: while

Sintaxe do while:

while [ condic~ao ]do

comandosdone

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 56: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Controles de lacos: while

Controles de lacos: while

Exemplo:

$ cat -n lacowhile.sh1 #!/bin/bash23 SAIDA=104 CONTADOR=056 while [ $CONTADOR -lt $SAIDA ]7 do8 echo "Atividades de sala aula"9 CONTADOR=$(( $CONTADOR + 1 ))10 done

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 57: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Funcoes

Funcoes sao empregadas para organizar a estrutura do codigo ourealizar determinada operacao ainda nao disponıvel no sistema.Por exemplo, uma funcao que leia o nome e a data de um filmeque foi assistido e armazene esses dados um arquivo texto.

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 58: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Funcoes

Uma funcao pode ser declarada da seguinte maneira:

nome_da_funcao () {comandos

}

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 59: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Funcoes

validaIdade() {ARG1=$1 # primeiro argumentoARG2=$2 # segundo argumento

if [ $ARG2 -gt $IDADE ]then

echo "Ola $ARG1, voce possui a maior idade"fi}

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 60: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Funcoes

1 #!/bin/bash

2 RESPOSTA1=""

4 RESPOSTA2=""

5 IDADE=18

6 CONTADOR=0

7 SAIDA=5

8 validaIdade() {

11 ARG1=$1

12 ARG2=$2

13 if [ $ARG2 -gt $IDADE ]; then

16 echo "Ola $ARG1, voce possui a maior idade"

17 fi

18 }

19 # Codigo Principal

20 while [ $CONTADOR -lt $SAIDA ]

21 do

22 echo "Qual seu nome?"

23 read RESPOSTA1

24 echo "Quantos anos voce tem?"

25 read RESPOSTA2

26 echo $RESPOSTA2

27 validaIdade $RESPOSTA1 $RESPOSTA2

28 CONTADOR=$(( $CONTADOR + 1 ))

29 done

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 61: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Array: Vetores

1 #!/bin/bash23 ARRAY=("LARANJA" "PERA" "UVA" "CARRO")45 echo "Sua sacola possui"6 for I in ${ARRAY[@]}7 do8 echo "$I"9 done

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 62: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Expressoes regulares

sed

awk

xargs

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 63: Tutorial Shell Script

IntroducaoComandos basicos

Interpretador de ComandosProgramando em ShellAtribuicao de variaveis

Teste de condicionalControles de lacos

FuncoesBonus

Expressoes regulares

$ for I in $(cat /etc/passwd | cut -f 1 -d:) ; do echo "ola $I" ; done

Kaio Rafael de Souza Barbosa, M.Sc Programacao em Shell Script

Page 64: Tutorial Shell Script

OperadoresOperadores Aritméticos Operadores Relacionais

+ Adição == Igual- Subtração != Diferente* Multiplicação > Maior/ Divisão >= Maior ou Igual

% Módulo < Menor** Exponenciação <= Menor ou Igual

Operadores de Atribuição Operadores de BIT

= Atribui valor a uma variável << Deslocamento à esquerda+= Incrementa a variável por uma constante >> Deslocamento à direita-= Decrementa a variável por uma constante & E de bit (AND)*= Multiplica a variável por uma constante | OU de bit (OR)/= Divide a variável por uma constante ^ OU exclusivo de bit (XOR)

%= Resto da divisão por uma constante ~ Negação de bit++ Incrementa em 1 o valor da variável ! NÃO de bit (NOT)-- Decrementa em 1 o valor da variável

Operadores Lógicos Operadores de BIT (atribuição)

&& E lógico (AND) <<= Deslocamento à esquerda|| OU lógico (OR) >>= Deslocamento à direita

&= E de bit|= OU de bit^= OU exclusivo de bit

RedirecionamentoOperador Ação

< Redireciona a entrada padrão (STDIN)> Redireciona a saída padrão (STDOUT)2> Redireciona a saída de erro (STDERR)>> Redireciona a saída padrão, anexando2>> Redireciona a saída de erro, anexando

| Conecta a saída padrão com a entrada padrão de outro comando2>&1 Conecta a saída de erro na saída padrão>&2 Conecta a saída padrão na saída de erro>&- Fecha a saída padrão2>&- Fecha a saída de erro

3<>arq Conecta o descritor de arquivos 3 ao arquivo 'arq'<<FIM Alimenta a entrada padrão (Here Document)<<-FIM Alimenta a entrada padrão, cortando TABs<(cmd) A saída do comando 'cmd' é um arquivo: diff <(cmd1) <(cmd2)>(cmd) A entrada do comando 'cmd' é um arquivo: tar cf >(bzip2 -c >file.tbz) $dir

Variáveis especiaisVariável Parâmetros Posicionais

$0 Parâmetro número 0 (nome do comando ou função)$1 Parâmetro número 1 (da linha de comando ou função)... Parâmetro número N ...$9 Parâmetro número 9 (da linha de comando ou função)

${10} Parâmetro número 10 (da linha de comando ou função)... Parâmetro número NN ...$# Número total de parâmetros da linha de comando ou função$* Todos os parâmetros, como uma string única

$@ Todos os parâmetros, como várias strings protegidasVariável Miscelânia

$$ Número PID do processo atual (do próprio script)$! Número PID do último job em segundo plano$_ Último argumento do último comando executado$? Código de retorno do último comando executado

Expansão de variáveisSintaxe Expansão Condicional

${var:-texto} Se var não está definida, retorna 'texto'${var:=texto} Se var não está definida, defina-a com 'texto'${var:?texto} Se var não está definida, retorna o erro 'texto'${var:+texto} Se var está definida, retorna 'texto', senão retorna o vazio

Sintaxe Expansão de Strings

${var} É o mesmo que $var, porém não ambíguo${#var} Retorna o tamanho da string${!var} Executa o conteúdo de $var (igual 'eval \$$var')${!texto*} Retorna os nomes de variáveis começadas por 'texto'${var:N} Retorna o texto à partir da posição 'N'${var:N:tam} Retorna 'tam' caracteres à partir da posição 'N'${var#texto} Corta 'texto' do início da string${var##texto} Corta 'texto' do início da string (* guloso)${var%texto} Corta 'texto' do final da string${var%%texto} Corta 'texto' do final da string (* guloso)${var/texto/novo} Substitui 'texto' por 'novo', uma vez${var//texto/novo} Substitui 'texto' por 'novo', sempre${var/#texto/novo} Se a string começar com 'texto', substitui 'texto' por 'novo'${var/%texto/novo} Se a string terminar com 'texto', substitui 'texto' por 'novo'

Blocos e agrupamentosSintaxe Descrição Exemplo

"..." Protege uma string, mas reconhece $, \ e ` como especiais "abc"'...' Protege uma string, nenhum caractere é especial 'abc'$'...' Protege uma string, mas interpreta \n, \t, \a, etc $'abc\n'`...` Executa comandos numa subshell, retornando o resultado `ls`{...} Agrupa comandos em um bloco { ls ; }(...) Executa comandos numa subshell ( ls )

$(...) Executa comandos numa subshell, retornando o resultado $( ls )((...)) Testa uma operação aritmética, retornando 0 ou 1 ((5 > 3))$((...)) Retorna o resultado de uma operação aritmética $((5+3))

[...] Testa uma expressão, retornando 0 ou 1 (alias do comando 'test') [ 5 -gt 3 ][[...]] Testa uma expressão, retornando 0 ou 1 (podendo usar && e ||) [[ 5 > 3 ]]

Opções do comando test ou [Testes em arquivos Testes em variáveis

-b É um dispositivo de bloco-c É um dispositivo de caractere Comparação Numérica-d É um diretório -lt É menor que (LessThan)-e O arquivo existe -gt É maior que (GreaterThan)-f É um arquivo normal -le É menor igual (LessEqual)-g O bit SGID está ativado -ge É maior igual (GreaterEqual)-G O grupo do arquivo é o do usuário atual -eq É igual (EQual)-k O sticky-bit está ativado -ne É diferente (NotEqual)-L O arquivo é um link simbólico-O O dono do arquivo é o usuário atual Comparação de Strings-p O arquivo é um named pipe = É igual-r O arquivo tem permissão de leitura != É diferente-s O tamanho do arquivo é maior que zero -n É não nula-S O arquivo é um socket -z É nula-t O descritor de arquivos N é um terminal-u O bit SUID está ativado Operadores Lógicos-w O arquivo tem permissão de escrita ! NÃO lógico (NOT)-x O arquivo tem permissão de execução -a E lógico (AND)-nt O arquivo é mais recente (NewerThan) -o OU lógico (OR)-ot O arquivo é mais antigo (OlderThan)-ef O arquivo é o mesmo (EqualFile)

Canivete Suíço do Shell (bash) — Aurélio Marinho Jargas | www.aurelio.net | @oreio

Page 65: Tutorial Shell Script

Escapes do prompt (PS1)Escape Lembrete Expande para...

\a Alerta Alerta (bipe)\d Data Data no formato "Dia-da-semana Mês Dia" (Sat Jan 15)\e Escape Caractere Esc\h Hostname Nome da máquina sem o domínio (dhcp11)\H Hostname Nome completo da máquina (dhcp11.empresa)\j Jobs Número de jobs ativos\l Tty Nome do terminal corrente (ttyp1)\n Newline Linha nova\r Return Retorno de carro\s Shell Nome do shell (basename $0)\t Time Horário no formato 24 horas HH:MM:SS\T Time Horário no formato 12 horas HH:MM:SS\@ At Horário no formato 12 horas HH:MM am/pm\A At Horário no formato 24 horas HH:MM\u Usuário Login do usuário corrente\v Versão Versão do Bash (2.00)\V Versão Versão+subversão do Bash (2.00.0)\w Working Dir Diretório corrente, caminho completo ($PWD)\W Working Dir Diretório corrente, somente o último (basename $PWD)\! Histórico Número do comando corrente no histórico\# Número Número do comando corrente\$ ID Mostra "#" se for root, "$" se for usuário normal\nnn Octal Caractere cujo octal é nnn\\ Backslash Barra invertida \ literal\[ Escapes Inicia uma seqüência de escapes (tipo códigos de cores)\] Escapes Termina uma seqüência de escapes

Escapes do comando echoEscape Lembrete Descrição

\a Alerta Alerta (bipe)\b Backspace Caractere Backspace\c EOS Termina a string\e Escape Caractere Esc\f Form feed Alimentação\n Newline Linha nova\r Return Retorno de carro\t Tab Tabulação horizontal\v Vtab Tabulação vertical\\ Backslash Barra invertida \ literal

\nnn Octal Caractere cujo octal é nnn\xnn Hexa Caractere cujo hexadecimal é nn

Formatadores do comando dateFormato Descrição

%a Nome do dia da semana abreviado (Dom..Sáb)%A Nome do dia da semana (Domingo..Sábado)%b Nome do mês abreviado (Jan..Dez)%B Nome do mês (Janeiro..Dezembro)%c Data completa (Sat Nov 04 12:02:33 EST 1989)%y Ano (dois dígitos)%Y Ano (quatro dígitos)%m Mês (01..12)%d Dia (01..31)%j Dia do ano (001..366)%H Horas (00..23)%M Minutos (00..59)%S Segundos (00..60)%s Segundos desde 1º de Janeiro de 1970%% Um % literal%t Um TAB%n Uma quebra de linha

Formatadores do comando printfFormato Descrição

%d Número decimal%o Número octal%x Número hexadecimal (a-f)%X Número hexadecimal (A-F)%f Número com ponto flutuante%e Número em notação científica (e+1)%E Número em notação científica (E+1)%s String

Letras do comando ls -lLetra Lembrete Tipos de Arquivo (primeiro caractere)

- - Arquivo normald Directory Diretóriol Link Link simbólicob Block Dispositivo de blocos (HD)c Char Dispositivo de caracteres (modem serial)s Socket Socket mapeado em arquivo (comunicação de processos)p Pipe FIFO ou Named Pipe (comunicação de processos)

Letra Lembrete Permissões do Arquivo (próximos nove caracteres)

- - Permissão desativadar Read Acesso de leituraw Write Acesso de escritax eXecute Acesso de execução (ou acesso ao diretório)X eXecute Acesso ao diretório somentes Set ID Usuário/grupo para execução (SUID, SGID)

permissão 'x' ativadaS Set ID Usuário/grupo para execução (SUID, SGID)

permissão 'x' desativadat sTicky Usuários só apagam seus próprios arquivos

permissão 'x' ativadaT sTicky Usuários só apagam seus próprios arquivos

permissão 'x' desativada

Curingas para nomes de arquivo (glob)Curinga Casa com... Exemplo

* Qualquer coisa *.txt? Um caractere qualquer arquivo-??.zip

[...] Qualquer um dos caracteres listados [Aa]rquivo.txt[^...] Qualquer um caractere, exceto os listados [^A-Z]*.txt{...} Qualquer um dos textos separados por vírgula arquivo.{txt,html}

Curingas para o comando caseCuringa Casa com... Exemplo

* Qualquer coisa *.txt) echo ;;? Um caractere qualquer arquivo-??.zip) echo ;;

[...] Qualquer um dos caracteres listados [0-9]) echo ;;[^...] Qualquer um caractere, exceto os listados [^0-9]) echo ;;...|... Qualquer um dos textos separados por | txt|html) echo ;;

Canivete Suíço do Shell (bash) — Aurélio Marinho Jargas | www.aurelio.net | @oreio

Page 66: Tutorial Shell Script

Sinais para usar com trap/kill/killall# Linux Cygwin SystemV AIX HP-UX Solaris BSD/Mac

1 HUP HUP HUP HUP HUP HUP HUP2 INT INT INT INT INT INT INT3 QUIT QUIT QUIT QUIT QUIT QUIT QUIT4 ILL ILL ILL ILL ILL ILL ILL5 TRAP TRAP TRAP TRAP TRAP TRAP TRAP6 ABRT ABRT IOT LOST ABRT ABRT ABRT7 BUS EMT EMT EMT EMT EMT EMT8 FPE FPE FPE FPE FPE FPE FPE9 KILL KILL KILL KILL KILL KILL KILL

10 USR1 BUS BUS BUS BUS BUS BUS11 SEGV SEGV SEGV SEGV SEGV SEGV SEGV12 USR2 SYS SYS SYS SYS SYS SYS13 PIPE PIPE PIPE PIPE PIPE PIPE PIPE14 ALRM ALRM ALRM ALRM ALRM ALRM ALRM15 TERM TERM TERM TERM TERM TERM TERM16 - URG USR1 URG USR1 USR1 URG17 CHLD STOP USR2 STOP USR2 USR2 STOP18 CONT TSTP CHLD TSTP CHLD CHLD TSTP19 STOP CONT PWR CONT PWR PWR CONT20 TSTP CHLD WINCH CHLD VTALRM WINCH CHLD21 TTIN TTIN URG TTIN PROF URG TTIN22 TTOU TTOU IO TTOU IO IO TTOU23 URG IO STOP IO WINCH STOP IO24 XCPU XCPU TSTP XCPU STOP TSTP XCPU25 XFSZ XFSZ CONT XFSZ TSTP CONT XFSZ26 VTALRM VTALRM TTIN - CONT TTIN VTALRM27 PROF PROF TTOU MSG TTIN TTOU PROF28 WINCH WINCH VTALRM WINCH TTOU VTALRM WINCH29 IO LOST PROF PWR URG PROF INFO30 PWR USR1 XCPU USR1 LOST XCPU USR131 SYS USR2 XFSZ USR2 - XFSZ USR232 - - - PROF - WAITING -33 - - - DANGER - LWP -34 - - - VTALRM - FREEZE -35 - - - MIGRATE - THAW -36 - - - PRE - CANCEL -37 - - - - - LOST -Como obter a listagem: trap -l, kill -l ou killall -lVeja também: man 7 signal

if, for, select, while, until, caseif for / select while / until case

if COMANDO for VAR in LISTA while COMANDO case $VAR inthen do do txt1) ... ;; ... ... ... txt2) ... ;;elif COMANDO done done txtN) ... ;;then *) ... ;; ... esacelse ou: ... for ((exp1;exp2;exp3))fi

Códigos de retorno de comandosCódigo Significado Exemplo

0 Nenhum erro, execução terminou OK echo1 A maioria dos erros comuns na execução echo $((1/0))2 Erro de uso em algum 'builtin' do Shell -

126 Comando não executável (sem permissão) touch a ; ./a127 Comando não encontrado ("command not found") echooo128 O parâmetro para o 'exit' não é um decimal exit 1.0

128+n 128 + código do sinal que o matou kill -9 $PPID #exit 137130 O programa interrompido com o Ctrl+C (128 + 2) -255 Parâmetro para o 'exit' não está entre 0 e 255 exit -1

Códigos de cores (ANSI)Cor Letra Fundo Atributo ValorExemplos: ESC [ <N>;<N> m

Preto 30 40 Reset 0 ESC[m texto normal (desliga cores)Vermelho 31 41 Negrito 1 ESC[1m negritoVerde 32 42 Sublinhado 4 ESC[33;1m amareloAmarelo 33 43 Piscando 5 ESC[44;37m fundo azul, letra cinzaAzul 34 44 Reverso 7 ESC[31;5m vermelho piscandoRosa 35 45 Na linha de comando:Ciano 36 46 echo -e '\e[33;1m amarelo \e[m'Branco 37 47 echo -e '\033[33;1m amarelo \033[m'

Metacaracteres das expressões regularesMeta Nome Descrição

. Ponto Curinga de um caractere[] Lista Casa qualquer um dos caracteres listados[^] Lista negada Casa qualquer caractere, exceto os listados? Opcional A entidade anterior pode aparecer ou não (opcional)* Asterisco A entidade anterior pode aparecer em qualquer quantidade+ Mais A entidade anterior deve aparecer no mínimo uma vez{,} Chaves A entidade anterior deve aparecer na quantidade indicada^ Circunflexo Casa o começo da linha$ Cifrão Casa o fim da linha\b Borda Limita uma palavra (letras, números e sublinhado)\ Escape Escapa um meta, tirando seu poder| Ou Indica alternativas (usar com o grupo)() Grupo Agrupa partes da expressão, é quantificável e multinível\1 Retrovisor Recupera o conteúdo do grupo 1\2 Retrovisor Recupera o conteúdo do grupo 2 (segue até o \9).* Curinga Casa qualquer coisa, é o tudo e o nada?? Opcional NG Idem ao opcional comum, mas casa o mínimo possível*? Asterisco NG Idem ao asterisco comum, mas casa o mínimo possível+? Mais NG Idem ao mais comum, mas casa o mínimo possível{}? Chaves NG Idem às chaves comuns, mas casa o mínimo possível

Metacaracteres nos aplicativosPrograma Opcional Mais Chaves Borda Ou Grupo

awk ? + - - | ()ed \? \+ \{,\} \b \| \(\)egrep ? + {,} \b | ()emacs ? + - \b \| \(\)expect ? + - - | ()find ? + - \b \| \(\)gawk ? + {,} \<\> | ()grep \? \+ \{,\} \b \| \(\)mawk ? + - - | ()perl ? + {,} \b | ()php ? + {,} \b | ()python ? + {,} \b | ()sed \? \+ \{,\} \<\> \| \(\)vim \= \+ \{,} \<\> \| \(\)

Canivete Suíço do Shell (bash) — Aurélio Marinho Jargas | www.aurelio.net | @oreio

Page 67: Tutorial Shell Script

Códigos prontosCondicionais com o IF

if [ -f "$arquivo" ]; then echo 'Arquivo encontrado'; fiif [ ! -d "$dir" ]; then echo 'Diretório não encontrado'; fiif [ $i -gt 5 ]; then echo 'Maior que 5'; else echo 'Menor que 5'; fiif [ $i -ge 5 -a $i -le 10 ]; then echo 'Entre 5 e 10, incluindo'; fiif [ $i -eq 5 ]; then echo '=5'; elif [ $i -gt 5 ]; then echo '>5'; else echo '<5'; fiif [ "$USER" = 'root' ]; then echo 'Oi root'; fiif grep -qs 'root' /etc/passwd; then echo 'Usuário encontrado'; fi

Condicionais com o E (&&) e OU (||)

[ -f "$arquivo" ] && echo 'Arquivo encontrado'[ -d "$dir" ] || echo 'Diretório não encontrado'grep -qs 'root' /etc/passwd && echo 'Usuário encontrado'cd "$dir" && rm "$arquivo" && touch "$arquivo" && echo 'feito!'[ "$1" ] && param=$1 || param='valor padrão'[ "$1" ] && param=${1:-valor padrão}[ "$1" ] || { echo "Uso: $0 parâmetro" ; exit 1 ; }

Adicionar 1 à variável $i

i=$(expr $i + 1)i=$((i+1))let i=i+1let i+=1let i++

Loop de 1 à 10

for i in 1 2 3 4 5 6 7 8 9 10; do echo $i; donefor i in $(seq 10); do echo $i; donefor ((i=1;i<=10;i++)); do echo $i; donei=1 ; while [ $i -le 10 ]; do echo $i ; i=$((i+1)) ; donei=1 ; until [ $i -gt 10 ]; do echo $i ; i=$((i+1)) ; done

Loop nas linhas de um arquivo ou saída de comando

cat /etc/passwd | while read LINHA; do echo "$LINHA"; donegrep 'root' /etc/passwd | while read LINHA; do echo "$LINHA"; donewhile read LINHA; do echo "$LINHA"; done < /etc/passwdwhile read LINHA; do echo "$LINHA"; done < <(grep 'root' /etc/passwd)

Curingas nos itens do comando case

case "$dir" in /home/*) echo 'dir dentro do /home';; esaccase "$user" in root|joao|maria) echo "Oi $user";; *) echo "Não te conheço";; esaccase "$var" in ?) echo '1 letra';; ??) echo '2 letras';; ??*) echo 'mais de 2';; esaccase "$i" in [0-9]) echo '1 dígito';; [0-9][0-9]) echo '2 dígitos';; esac

Caixas do Dialog

dialog --calendar 'abc' 0 0 31 12 1999dialog --checklist 'abc' 0 0 0 item1 'desc1' on item2 'desc2' offdialog --fselect /tmp 0 0

(echo 50; sleep 2; echo 100) | dialog --gauge 'abc' 8 40 0dialog --infobox 'abc' 0 0dialog --inputbox 'abc' 0 0dialog --passwordbox 'abc' 0 0dialog --menu 'abc' 0 0 0 item1 'desc1' item2 'desc2'dialog --msgbox 'abc' 8 40dialog --radiolist 'abc' 0 0 0 item1 'desc1' on item2 'desc2' offdialog --tailbox /tmp/arquivo.txt 0 0dialog --textbox /tmp/arquivo.txt 0 0dialog --timebox 'abc' 0 0 23 59 00dialog --yesno 'abc' 0 0Dica1: dialog ... && echo 'Apertou OK/Yes' || echo 'Apertou Cancel/No'Dica2: resposta=$(dialog --stdout --TIPODACAIXA 'abc' ...)

Atalhos da linha de comando (set -o emacs)Atalho Descrição Tecla Similar

Ctrl+A Move o cursor para o início da linha HomeCtrl+B Move o cursor uma posição à esquerda <-Ctrl+C Envia sinal EOF() para o sistemaCtrl+D Apaga um caractere à direita DeleteCtrl+E Move o cursor para o fim da linha EndCtrl+F Move o cursor uma posição à direita ->Ctrl+H Apaga um caractere à esquerda BackspaceCtrl+I Completa arquivos e comandos TABCtrl+J Quebra a linha EnterCtrl+K Recorta do cursor até o fim da linhaCtrl+L Limpa a tela (igual ao comando clear)Ctrl+N Próximo comandoCtrl+P Comando anteriorCtrl+Q Destrava a shell (veja Ctrl+S)Ctrl+R Procura no histórico de comandosCtrl+S Trava a shell (veja Ctrl+Q)Ctrl+T Troca dois caracteres de lugarCtrl+U Recorta a linha inteiraCtrl+V Insere caractere literalCtrl+W Recorta a palavra à esquerdaCtrl+X Move o cursor para o início/fim da linha (2x) Home/EndCtrl+Y Cola o trecho recortado

Caixa de ferramentas do shelleiroComando Função Opções úteis

cat Mostra arquivo -n, -scut Extrai campo -d -f, -c

date Mostra data -d, +'...'diff Compara arquivos -u, -Nr, -i, -w

echo Mostra texto -e, -nfind Encontra arquivos -name, -iname, -type f, -exec, -orfmt Formata parágrafo -w, -u

grep Encontra texto -i, -v, -r, -qs, -n, -l, -w -x, -A -B -Chead Mostra Início -n, -c

od Mostra Caracteres -a, -c, -o, -xpaste Paraleliza arquivos -d, -sprintf Mostra texto nenhumarev Inverte texto nenhumased Edita texto -n, -f, s/isso/aquilo/, p, d, q, Nseq Conta Números -s, -fsort Ordena texto -n, -f, -r, -k -t, -otac Inverte arquivo nenhumatail Mostra Final -n, -c, -ftee Arquiva fluxo -atr Transforma texto -d, -s, A-Z a-z

uniq Remove duplicatas -i, -d, -uwc Conta Letras -c, -w, -l, -L

xargs Gerencia argumentos -n, -i

Caracteres ASCII imprimíveis (ISO-8859-1)

32 64 @ 96 ` 162 ¢ 194 Â 226 â 33 ! 65 A 97 a 163 £ 195 Ã 227 ã 34 " 66 B 98 b 164 ¤ 196 Ä 228 ä 35 # 67 C 99 c 165 ¥ 197 Å 229 å 36 $ 68 D 100 d 166 ¦ 198 Æ 230 æ 37 % 69 E 101 e 167 § 199 Ç 231 ç 38 & 70 F 102 f 168 ¨ 200 È 232 è 39 ' 71 G 103 g 169 © 201 É 233 é 40 ( 72 H 104 h 170 ª 202 Ê 234 ê 41 ) 73 I 105 i 171 « 203 Ë 235 ë 42 * 74 J 106 j 172 ¬ 204 Ì 236 ì 43 + 75 K 107 k 173 205 Í 237 í 44 , 76 L 108 l 174 ® 206 Î 238 î 45 - 77 M 109 m 175 ¯ 207 Ï 239 ï 46 . 78 N 110 n 176 ° 208 Ð 240 ð 47 / 79 O 111 o 177 ± 209 Ñ 241 ñ 48 0 80 P 112 p 178 ² 210 Ò 242 ò 49 1 81 Q 113 q 179 ³ 211 Ó 243 ó 50 2 82 R 114 r 180 ´ 212 Ô 244 ô 51 3 83 S 115 s 181 µ 213 Õ 245 õ 52 4 84 T 116 t 182 ¶ 214 Ö 246 ö 53 5 85 U 117 u 183 · 215 × 247 ÷ 54 6 86 V 118 v 184 ¸ 216 Ø 248 ø 55 7 87 W 119 w 185 ¹ 217 Ù 249 ù 56 8 88 X 120 x 186 º 218 Ú 250 ú 57 9 89 Y 121 y 187 » 219 Û 251 û 58 : 90 Z 122 z 188 ¼ 220 Ü 252 ü 59 ; 91 [ 123 { 189 ½ 221 Ý 253 ý 60 < 92 \ 124 | 190 ¾ 222 Þ 254 þ 61 = 93 ] 125 } 191 ¿ 223 ß 255 ÿ 62 > 94 ^ 126 ~ 192 À 224 à 63 ? 95 _ 161 ¡ 193 Á 225 á

Canivete Suíço do Shell (bash) — Aurélio Marinho Jargas | www.aurelio.net | @oreio


Top Related