introdução ao shell script no linux.docx
TRANSCRIPT
-
8/17/2019 Introdução ao Shell Script no Linux.docx
1/15
Introdução ao Shell Script no Linux
Veja neste artigo como criar códigos para automatização de tarefas rotineiras utilizando o
interpretador de comandos bash em sistemas Unix-lie! Serão dados os conceitos b"sicos e as
sintaxes e explicaç#es dos principais comandos!
Podemos utilizar a criação de arquivos de scripts para tornar mais simples as execuções de tarefasrepetitivas no dia a dia. Muito tempo do programador é empregado em ações desse tipo, como abrir osmesmos programas todos os dias; esvaziar a lixeira e diretrios temp para economizar espaço em disco;etc.
!m script nada mais é do que um algoritmo pro"etado para realizar uma determinada tarefa, utilizandoos comandos espec#ficos do bas$ e os execut%veis do sistema operacional.
&embre'se de executar os comandos como usu%rio comum e não como root, visto que, como root tudo
ser% aceito e, dependendo do que voc( fizer, isto pode gerar danos ao sistema operacional. !ma maneiraf%cil de verificar é abrir o terminal e se o s#mbolo antes do cursor é o )*), voc( est% como usu%riocomum, mas se é o )+), voc( est% como root. Para sair do modo root, digite
exit
$riação do shell script
-m primeiro lugar precisaremos de um arquivo para escrever o nosso script. Podemos fazer isso viaterminal ou via modo gr%fico, sendo que, no ltimo caso, basta apenas clicar com o botão direito domouse em um diretrio dese"ado e escol$er /criar novo arquivo de texto/ ou 0criar novo documento1.
Para criar um arquivo via terminal, basta abrir o mesmo e digitar
vi exemplo1.sh
2ambém podemos fazer
touch exemplo1.sh
3 comando vi cria e abre um arquivo para leitura4escrita no terminal, enquanto o comando touc$ criaum arquivo, mas não o abre. Posteriormente é poss#vel abri'lo com um editor de sua prefer(ncia.
$oncedendo permiss#es ao ar%ui&o
Para editar o arquivo, precisamos dar permissão de escrita a ele.
Para a primeira alternativa, em que o vi abriu direto o arquivo, precisamos pressionar -56 para edit%'lo,assim, ao se fazer isso, o caractere )) aparece, então digite
!chmod 777 %
1
-
8/17/2019 Introdução ao Shell Script no Linux.docx
2/15
Para a segunda alternativa, em que o touc$ não abriu o arquivo criado, basta digitar
chmod 777 exemplo1.sh
3 c$mod é utilizado para setar permissões em arquivos e diretrios. 3 valor 777 concede todos osdireitos 8read, 9rite, execute: para o usu%rio, o grupo e os outros. o invés de 777, outro modo de fazerisso é digitando ) faz refer(ncia ao arquivo atual. Pode'se também, ao invés de utiliz%'lo, fornecer o nomedo arquivo.
'dição e execução do ar%ui&o
?este artigo utilizaremos o vi, no terminal, mas voc( pode escol$er qualquer outro editor, gr%fico ounão.
bra o arquivo com o comando
vi exemplo1.sh
6om o vi voc( precisa digitar )i) para coloc%'lo no modo de inserção.
!m s$ell script começa 8mas não necessariamente: definindo qual o interpretador de comandos que ser%utilizado para interpretar e executar o script. -xistem outros além do bas$, como o s$, o @s$ e o cs$.
#!/bin/SHELL_ATAL
(igura )! -xecução do cdigo bas$
6omo vemos na (igura ), a primeira lin$a de um s$ell script define qual o interpretador de comandosser% utilizado.
?ote que utilizamos o pat$ completo de onde se encontra o s$ell, no caso, no diretrio 4bin4.
ps isso, é $ora de iniciarmos o nosso script. Para este artigo, o exemplo imprimir% na tela algumasinformações sobre o usu%rio e o computador, conforme o cdigo da Listagem )!
2
-
8/17/2019 Introdução ao Shell Script no Linux.docx
3/15
Listagem )! 6digo do exemploA.s$
#!/bin/bsh echo "Seu nome de usu$io &" 'homi echo "(n)o de ho$ tul e tempo *ue o computdo$ est li+do&" uptime echo ", sc$ipt est executndo do di$et-$io&" p'd
-ste cdigo nos fornece algumas informações sobre o usu%rio, algumas informações da m%quina e sobreo local de armazenamento do nosso script.
Para salvarmos o arquivo digitamos -56 e depois 09q1 para gravar as alterações e sair.
Para executar o script, $% dois pontos a considerar
A. 5e voc( tiver salvo o seu arquivo no diretrio atual, basta execut%'lo digitando no prompt
./exemplo1.sh
B. 5e voc( tiver salvo o seu arquivo em outro diretrio qualquer, voc( precisar% informar o pat$completo até ele. 6onsiderando que ele este"a em 4tmp4scripts
/tmp/sc$ipts/exemplo1.sh
• 3 comando ec$o exibe na tela a string entre aspas duplas. 6aso voc( não queira que ela fiqueentre aspas duplas, simplesmente não as forneça no comando ec$o;
• 3 comando 9$oami exibe o usu%rio logado no sistema;
• 3 comando uptime exibe a $ora atual, o tempo decorrido desde que o computador foi ligado, onmero de usu%rios logados e uma média do nmero de processos carregados nos ltimos um,cinco e AC minutos;
•
3 comando p9d exibe o diretrio no qual o arquivo est% rodando.2oda string que contiver espaços deve estar entre aspas duplas.
Inserindo coment"rios
6oment%rios em cdigos são muito importantes. -xplicar o que est% sendo feito e dar informações sobreo funcionamento do cdigo permite ao desenvolvedor economizar tempo para entend('lo.
Para inserir coment%rios no seu script, basta iniciar a lin$a com o caractere )+), como no cdigo daListagem * e execução na (igura *!
Listagem *! 5$ell script com coment%rios.
3
-
8/17/2019 Introdução ao Shell Script no Linux.docx
4/15
#!/bin/bsh
#Este um coment$io #Este out$o coment$io echo "Este sc$ipt contm coment$ios."
(igura *! 5a#da da execução do cdigo da Listagem *.
6omo pode ser observado, os coment%rios não são processados, portanto, não aparecem para o usu%rio.
+eclarando e utilizando &ari"&eis
!ma vari%vel é um label 8nome: que armazena um valor para ser utilizado posteriormente no cdigo.5eu uso evita repetições de valores por parte do programador e torna o cdigo mais informativo e limpo.
linguagem do s$ell não é tipada, ou se"a, pode'se armazenar qualquer tipo de valor em uma vari%vel,desde strings a nmeros.
Para declar%'las basta seguir a sintaxe
nome_d_v$ivelvlo$
onde
• nomeDdaDvariavel sequ(ncia de caracteres que deve começar por qualquer letra maiscula ouminscula ou underscore 8D:;
• valor qualquer dado que deva ser valorado E vari%vel.
,ota 3bserve que não deve $aver espaços entre o sinal de igual e o nome e o valor da vari%vel.
Para utilizarmos o valor da vari%vel coloca'se o * 8cifrão: na frente de seu nome, como mostra o
exemplo da Listagem .!
Listagem .! Feclarando e utilizando vari%veis.
#!/bin/bsh site'''.devmedi.com.b$ meu_nume$o_)vo$ito1 _cidde0o$to Ale+$e0 echo 2m -timo site p$ voc3 p$ende$ p$o+$m$ e se mnte$ tuli4do &5site0 echo 26eu nme$o )vo$ito & 5meu_nume$o_)vo$ito0 echo 26inh cidde ntl & 5_cidde0
4
-
8/17/2019 Introdução ao Shell Script no Linux.docx
5/15
gora, se voc( dese"a printar o nome da prpria vari%vel, basta colocar uma barra invertida )G) antes do *,assim, ela nega o caractere seguinte e normalmente é utilizada para caracteres de scape 8ou se"a,caracteres que "% tem uma função espec#fica, mas que voc( dese"a somente utilizar em um nome ouvalor, sem execut%'los:. He"amos um exemplo na Listagem /!
Listagem /! Printando o nome de uma vari%vel ao invés de seu contedo.
#!/bin/bsh nome)e$nnd echo 2, nome d v$ivel 85nome0
0tribuindo sa1das de comandos a &ari"&eis
I poss#vel armazenar o resultado de um comando em uma vari%vel. Jsso é muito til em situações em
que se usar% este resultado em mais de um lugar ao longo do script.
K% duas sintaxes para isso
A. nomeDdaDvariavelL*8comando:
B. nomeDdaDvariavelLcomando
Hoc( pode escol$er a que mel$or l$e agrada ou empregar as duas nos seus scripts.
3 prximo exemplo lista as informações relativas a todos os discos e partições do sistema
#!/bin/bsh s9stem_in)o:d) ;h: # Tmbm pode$i se$ s9stem_in)o5
-
8/17/2019 Introdução ao Shell Script no Linux.docx
6/15
$omandos de seleção ou de tomada de decisão
?a maioria das vezes precisamos seguir um determinado fluxo de execução baseado em alguma decisãotomada pelo usu%rio ou outro sistema que este"a utilizando o nosso. 3 comando mais simples que
permite isso é o condicional, que tem a seguinte sintaxe
i) B C,D(CA, F@then AGESIi
3nde
• 63?FJ63 teste que, se verdadeiro, passar% o controle para o bloco dentro do t$en;
• O-5 comandos a serem executados se o resultado de 63?FJ63 for verdadeiro.
,ota I muito comum o desenvolvedor esquecer de fec$ar o if. &embre'se sempre que, para cada if
aberto, voc( precisa fec$%'lo com o fi.
,ota &embre'se que, se utilizar o )Q), voc( deve fec$%'lo com o )R), e deixando sempre espaços ao redor.Jsso é muito importante, pois eles são um 0atal$o1 para o comando )test). Jsso significa que,alternativamente, voc( poderia querer não utilizar os colc$etes
i) test C,D(CA,@then AGESIi
Mas normalmente se utiliza os colc$etes por ser mais compacto e para ficar mais semel$ante ao formato
em outras linguagens. Fe qualquer forma, a escol$a é sua.
,ota -m outras linguagens de programação o if testa uma condição, mas em s$ell script o if testa asa#da de um comando.
Hamos a um exemplo em que o usu%rio dever% digitar um nmero e verificaremos se ele est% em umdeterminado intervalo, como mostra a Listagem 3!
Listagem 3! !tilizando o condicional if...t$en
#!/bin/bsh echo 2i+ite um nme$o *ul*ue$&0 $ed nume$o@
6
-
8/17/2019 Introdução ao Shell Script no Linux.docx
7/15
i) B 25nume$o0 ;+t JK F@ then echo 2Este nme$o mio$ *ue JK!0 )i
He"a a seguir os parSmetros mais comuns utilizados com o comando test
• n stringA o comprimento de stringA é diferente de T;
• z stringA o comprimento de stringA é zero;stringA 4 stringB stringA e stringB são id(nticas;stringA 54 stringB stringA e stringB são diferentes;inteiroA -e% inteiroB inteiroA possui o mesmo valor que inteiroB;inteiroA -ne inteiroB inteiroA não possui o mesmo valor que inteiroB;inteiroA -gt inteiroB inteiroA é maior que inteiroB;inteiroA -ge inteiroB inteiroA é maior ou igual a inteiroB;
inteiroA -lt inteiroB inteiroA é menor que inteiroB;inteiroA -le inteiroB inteiroA é menor ou igual a inteiroB;
• e nomeDdoDarquivo verifica se nomeDdoDarquivo existe;
• d nomeDdoDarquivo verifica se nomeDdoDarquivo é um diretrio;
• f nomeDdoDarquivo verifica se nomeDdoDarquivo é um arquivo regular 8texto, imagem, programa, docs, planil$as:.
6 comando else
-xiste a possibilidade de também tratar o caso em que o nosso teste fal$a. Para isso temos o comandoelse, cu"a sintaxe é
i) B C,D(CA, F@ then AGES_1 else AGES_J)i
3nde
• 63?FJ63 teste que, se verdadeiro, passar% o controle para o bloco dentro do t$en;
• O-5DA comandos a serem executados se o resultado de 63?FJ63 for verdadeiro;
• O-5DB comandos a serem executados se o resultado de 63?FJ63 for falso.
He"amos um exemplo na Listagem 7 que verifica se um nmero digitado pelo usu%rio é positivo ounegativo.
Listagem 7! !tilizando o condicional if...t$en...else.
7
-
8/17/2019 Introdução ao Shell Script no Linux.docx
8/15
#!/bin/bsh echo 2i+ite um nme$o *ul*ue$&0 $ed nume$o@ i) B 25nume$o0 ;+e K F@ then echo 2, nme$o 5nume$o positivo!0
else echo 2, nme$o 5nume$o ne+tivo!0)i
6 comando elif
K% casos em que temos mais de uma condição a ser testada, todas correlacionadas. Para isso temos ocomando elif, cu"a sintaxe é
i) B C,D(CA,_1 F@ then AGES_1 eli) B C,D(CA,_J F@ then AGES_J eli) B C,D(CA,_ F@ then AGES_ . . . . eli) B C,D(CA,_D F@ then AGES_DIi
3nde
• 63?FJ63DA U 63?FJ63D? teste que, se verdadeiro, passar% o controle para o blocodentro do respectivo t$en;
• O-5DA U O-5D? comandos a serem executados se os resultados de 63?FJ63DA U63?FJ63D? forem verdadeiros.
seguir temos um exemplo que apresenta um menu para o usu%rio escol$er uma opção. Vaseado nestaescol$a, a $ora e a data serão exibidas; uma divisão ser% efetuada e seu resultado ser% exibido, e umamensagem ser% exibida com o nome que o usu%rio fornecer, como mostra a Listagem 8!
Listagem 8! !tilizando o comando elif.
8
-
8/17/2019 Introdução ao Shell Script no Linux.docx
9/15
#!/bin/bshecho "Selecione um opMo&"echo "1 ; Exibi$ dt e ho$ do sistem"echo "J ; Exibi$ o $esultdo d divisMo 1K/J"echo " ; Exibi$ um mens+em0$ed opco@
i) B 5opco "1" F@then dt5
-
8/17/2019 Introdução ao Shell Script no Linux.docx
10/15
• O-5DA U O-5D? ações a serem tomadas caso a vari%vel combine com 653DA U653D?, respectivamente.
Por exemplo, modificando o exemplo anterior temos o cdigo da Listagem 9!
Listagem 9! !tilizando o comando case.
#!/bin/bsh echo "Selecione um opMo&" echo "1 ; Exibi$ dt e ho$ do sistem" echo "J ; Exibi$ o $esultdo d divisMo 1K/J" echo " ; Exibi$ um mens+em0$ed opco@ cse 5opco in 210= dt5
-
8/17/2019 Introdução ao Shell Script no Linux.docx
11/15
3bserve que são apenas duas retic(ncias.
Xuando o loop for começa, a vari%vel é inicializada com o primeiro valor do con"unto, e ocorre a primeira iteração 8entrada no laço e execução dos comandos:. Para as iterações seguintes, os valores docon"unto serão atribu#dos E vari%vel, sucessivamente, até que se alcance o ltimo e o loop termine a
execução.
He"a o exemplo da Listagem ) #!/bin/bsh echo 2Testndo o loop )o$0 )o$ i in 1K..K@ do echo 25i0 done
3utra forma de criarmos sequ(ncias de valores é com o comando se%, como mostra a Listagem ))!
Listagem ))! -xemplo de uso do loop for com o comando seq com intervalo.
#!/bin/bsh echo 2Testndo o comndo se*0
)o$ i in 5
-
8/17/2019 Introdução ao Shell Script no Linux.docx
12/15
'hile B C,D(CA, F@ do AGES done
3nde
• 63?FJ63 condição cu"a veracidade determina a perman(ncia no laço;
• O-5 ações a serem tomadas enquanto 63?FJ63 for verdadeira.
Hamos na Listagem ). um exemplo que exibe ao usu%rio o que ele digitou, enquanto ele não informar'A.
Listagem ).! -xemplo de uso do loop 9$ile.
#!/bin/bsh
echo 2(n)o$me o *ue voc3 *uise$O ;1 p$ si$0 $ed ddo@ 'hile B 5ddo ! 2;10 F@ do echo 2oc3 di+itou 5ddo0 $ed ddo@ done
He"amos um outro exemplo com contador na Listagem )/!
Listagem )/! -xemplo de uso do loop 9$ile com contador.
#!/bin/bsh echo 2(n)o$me t *ue vlo$ positivo e mio$ *ue 4e$o cont$&0 $ed vlo$@ i1 'hile B 5i ;le 5vlo$ F@ do echo 25i0
-
8/17/2019 Introdução ao Shell Script no Linux.docx
13/15
3 uso de funções é imprescind#vel para separar, organizar e estruturar a lgica de qualquer algoritmo,se"a em s$ell script ou qualquer outra linguagem de programação. 5ua sintaxe é muito simples
nome_)unco
-
8/17/2019 Introdução ao Shell Script no Linux.docx
14/15
0rgumentos
?ormalmente um programa recebe argumentos como entrada, ou se"a, dados fornecidos pelo usu%rio ou por outro programa, os quais devem ser 0consumidos1 para produzir as sa#das dese"adas.
-m s$ell script não poderia ser diferente temos nomes especiais para designar os argumentos recebidos por um script
• *T Z contém o nome do script que foi executado;
• *A U *n Z cont(m os argumentos na ordem em que foram passados 8A[ argumento em *A, B[argumento em *B, etc.:.
• *+ ' contém o nmero de argumentos que foi passado 8ou se"a, não considera o nome do scriptem *T:;
• *\ ' retorna todos os argumentos de uma vez s.
Hamos ao exemplo da Listagem )3 e sua execução é exibida na (igura .!
Listagem )3! -xemplo de uso de argumentos em scripts.
#!/bin/bsh
i) B 5# ;lt 1 F@
then echo "$ecis )o$nece$ pelo menos 1 $+umento!" exit 1 )i echo "Dme$o de $+umentos pssdos& 5#"iK)o$ $+umento in 5V do i5
-
8/17/2019 Introdução ao Shell Script no Linux.docx
15/15
6onforme vimos no artigo, s$ell scripts são a mel$or maneira de automatizar tarefas di%rias em sistemas!nix'li@e. lém de pr%ticos, nos poupam muito tempo, além de possu#rem uma sintaxe simples e
permitir processar desde pequenas quantidades de dados até executar tarefas mais robustas.
15