Decorrente da complexidade dos interpretadores de comando e tambm pela grande quantidade de comandos e opes disponveis, no h como abranger neste treinamento, todas as funcionalidades da programao em Shell Script !ara aqueles que dese"am se aprofundar na programao em Shell Script recomendvel a leitura do livro# !rogramao Shell Script, do $%lio &eves, da 'ditora (rasport )ivros e *ultimdia )tda 'ntretanto, as informaes que sero apresentadas, liberam grandes possibilidades de programao no ambiente Shell bash, onde as principais estruturas de controle e comandos adicionais, sero apresentadas + importante tambm que o leitor procure conhecer mais sobre as expresses regulares 'stas expresses so muito utili,adas e aceitas por diversos comandos do ambiente Shell, principalmente pelos comandos Sed, -./, grep, dentre outros
1 Shell Scripts
Shell scripts nada mais so que arquivos que contm uma seq01ncia de comandos para execuo seq0encial pelo Shell 2omo o tipo de interpretador de comandos que iremos descrever ser o bash, a primeira linha de um arquivo de Shell script dever conter a seguinte seq01ncia# #!/ i!/ "sh 3s arquivos do tipo Shell scripts precisam tambm possuir a permisso de execuo, no mnimo para o usurio dono do arquivo 'sta permisso pode ser concedida pelo comando abaixo# #ch#$% &'( )"r*&i+$,shell,script- $& #ch#$% .// )"r*&i+$,shell,script&unca demais lembrar que, para o Shell ao executar o seu arquivo de Shell script, ele precisa estar contido dentro dos diret4rios da varivel !-56, caso contrrio voc1 ter que informar o caminho completo at o arquivo Se estiver posicionado no mesmo diret4rio onde reside seu Shell script para sua execuo basta informar #0/)"r*&i+$,shell,script-0
Pg. 1
Re6r"s
=sic"s>
8ualquer string entre aspas simples 9 8 : considerada literalmente, mas no permitido a 8ualquer string entre aspas duplas 9 : : considerada
literalmente e a substituio de
8ualquer caracter depois da contra=barra 9 ; : considerado literalmente 'le protege o &unca confundir aspas simples 9 8 : com a crase 9 ? :
'xemplos# # ech$ @PATH >usr>local>bin#>usr>local>sbin#>sbin#>usr>sbin#>bin#>usr>bin#>usr>bin>?@@ # ech$ 8@PATH8 A!-56 # e(p$rt PS1A?&!"#e <!?8@PBC8;;@ micro@>tmpB # ech$ O D"l$r %" D"ri=+el ;@TERM E @TERM 3 Calor da Carivel A5'D* xterm # ech$ FD$cG p$ss&i ?ls <l H Ic <l? "r*&i+$s e# ?pI%?F Coc1 possui @E arquivos em >tmp
que
se
# c% /etc L ls <l" ==I Cai para o diret4rio >etc e executa o comando ls =la # ech$ Ol" @SSER9 h$Te E ?%"te? L ech$ DeT" $ c"le!%=ri$ " "i($> L c"l 3la root, ho"e Sb -br @K @K#LK#KM (D5 NEEO Ce"a o calendrio abaixo# -bril NEEO Do Se 5e 8u 8u Se S @ N P L K O Q R M @E @@ @N @P @L @K @O @Q @R @M NE N@ NN NP NL NK NO NQ NR NM PE c$#"!%$1 ?c$#"!%$1? ==I Substituio de comandos 'sta sintaxe utili,a a sada do comandoN como entrada de par;metros para comando@ 'xemplo# # Uill <V ?ls$M <t <& t&(? 'ste comando ir encerrar todos os processos do usurio tux no sistema c$#"!%$1 H c$#"!%$1 ==I 2anali,a a sada do comando@ como entrada do comandoN 'xemplo# #ls <l /etc/W0c$!M H Ic <l 'ste comando informa o n%mero de arquivos com a extenso 0c$!M no diret4rio /etc c$#"!%$1 NN c$#"!%$1 ==I 'xecuta comandoN se o comando@ for bem=sucedido
'xemplo# # %M <h NN %& <hs /etc -presenta a utili,ao dos discos no sistema e o total de espao utili,ado pelo diret4rio >etc c$#"!%$1 HH c$#"!%$1 ==I 'xecuta comandoN se o comando@ falhar 4&# $& $&tr$70 'xemplo# # c"t p"ssI$r% HH c"t p"ssI% H Ic <l 3 comando c"t p"ssI$r% ir falhar, logo o segundo comando ser executado
Pg. 3
X Oper"%$res
3s operadores l4gicos so utili,ados em qualquer linguagem de programao, inclusive na programao Shell script -baixo esto listados os operadores l4gicos e aritmticos usados pelo Shell, pela ordem decrescente de preced1ncia# ! 9 Y &egao l4gica, complemento de @ 9usado em operaes binrias:< W 9 / 9 Z *ultiplicao, Diviso, m4dulo 9resto da diviso:< ' 9 < -dio, Subtrao< )) 9 -- Deslocamento de bit 7 esquerda e deslocamento de bit 7 direita< )A 9 -A *enor ou igual, *aior ou igual< ) 9 *enor que, *aior que< AA 9 !A Jgualdade, Desigualdade< N ' 9-&D:, utili,ado para operaes binrias< [ 3S 'xclusivo 9exclusive 3D:, usado em operaes binrias< H 3S 93D:, utili,ado em operaes binrias< NN ' 9-&D: l4gico< HH 3S 93D: l4gico< A -tribuio de valor
/ D"ri=+eis Especi"is
- implementao do Shell bash, libera algumas variveis especiais que so pr=definidas quando ele iniciado, permitido grande flexibilidade na programao, inclusive a passagem de par;metros D"ri=+eis %$ Shell> @# @< @\ @@ @! @! @R @W @] Jnforma o n%mero de par;metros passados ao script Shell< 3pes fornecidas pelo Shell< Jnforma o valor de retorno do %ltimo comando executado pelo script Shell< Jnforma o n%mero do processo 9!JD: do script Shell em execuo< &%mero do %ltimo processo 9!JD: executado em bac/ground< Calor do par;metro passado ao Shell, nT@, at M, da esquerda para a direita< &ome do programa ou Shell em execuo< Jnforma todos os par;metros passados ao script, separados por espaos em branco< Jgual 7 varivel anterior AU
Pg. 4
3nde# <t )se6&!%$s- 5imeout para a entrada de dados, em segundos< <p )pr$#pt- !rompt a ser apresentado na digitao dos dados< <! )!`#er$,c"r"ct- &%mero de caracteres que sero lidos pelo comando< <% )%eli#it"%$r- 2aractere delimitador Dead l1 entrada at encontrar o delimitador< !"#e )!$#e,c"#p- &ome da varivel que guardar os valores lidos pelo read 'xemplo# BV>bin>bash B echo =n W'ntre com &ome e Sobrenome# W read &3*' S3(D'&3*' echo W3l A&3*' V seu Sobrenome # AS3(D'&3*'W
<U <L <p <r <s <S <& <I <( <O <G "r*1 <!t "r*1 "r*1 <$t "r*1 "r*1 <eM "r*1 <c stri!6 <! stri!6 stri!61 A stri!61 stri!6 1 !A stri!61 !e(press3$ e(p1 <" e(p1 e(p1 <$ e(p1 "r61 <e* "r61 "r61 <!e "r61 "r61 <lt "r61 "r61 <6t "r61 "r61 <6e "r61 "r61 <le "r61 'xemplos#
possui o stic/\ bit ligado< lin/ simb4lico< pipe< possvel ler o arquivo< tamanho maior que ,ero< soquete< possui o bit set user id 9SSJD: ativado< possvel gravar no arquivo< possvel executar o arquivo< proprietrio do 'SJD< proprietrio do '[JD< arq@ mais novo que arqN< arq@ mais velho que arqN< arq@ lin/ absoluto para arqN< string de tamanho ,ero< string de tamanho maior que ,ero< as strings so iguais< as strings so diferentes< nega a expresso, ou tambm a expresso falsa< exp@ -&D expN< exp@ 3D expN< argumento@ igual ao argumentoN< argumentos so diferentes< argumento@ menor que argumentoN argumento@ maior que argumentoN argumento@ maior ou igual ao argumentoN argumento@ menor ou igual ao argumentoN
# test <( /&sr/s i!/!# % <" <( /&sr/s i!/s# % HH e(it R Cerifica se ambos 9-&D: os daemon do samba so executveis 'sta comparao toda o primeiro comando, executada com sucesso, logo o comando exit E no ser executado O F@TBACdSPF A CIKEREeCIAL P NN; Mi!% @CBACdSP <#ti#e <@CIK Ht"r <cT+M @STOCED <T < ; 1- /+"r/l$6/ "cU&p,%iM,?%"te 'ZfZ%Z#ZUZMZS? ; 1-/+"r/l$6/ "cU&p,%iM,?%"te 'ZfZ%Z#ZUZMZS? N TPICA@! Cerifica se o conte%do da varivel @TBACdSP CIKEREeCIAL e caso positivo executa o comando Mi!%, buscando os diret4rios>arquivos contidos na varivel @CBACdSP, com o par;metro #ti#e <@CIK9 onde a varivel @CIK informa quantas horas atrs os arquivos foram modificados, o default NL horas, ou se"a, busca arquivos alterados nas %ltimas NL horas 3 resultado do comando Mi!% passado ao comando t"r para criar um pacote de arquivos em @STOCED 9pode ser arquivo ou fita magntica:, com compresso cip10 3 par;metro <T< informa ao t"r para pegar os arquivos da entrada padro, que na verdade a sada do comando Mi!%
Pg. 6
5anto a sada padro do t"r, quanto sua s"g%" %e err$s, iro gerar um log no diret4rio >var>log indicando no nome do arquivo o ano, dia, m1s, hora, minuto e segundo 5odo o comando ser executado em "cU6r$&!% e seu PIC ser arma,enado na varivel @TPIC
^0X C$#"!%$ iM
-baixo veremos o comando if que utili,ado para testes condicionais Sintaxe# iM )e(press3$1the! list" %e c$#"!%$s 1 eliM )e(press3$1the! list" %e c$#"!%$s 1 else $&tr$s c$#"!%$s Mi 'xemplo# BV>bin>bash B if ] AB =ge N ^ then echo AN elif ] AB =eq @ ^ then echo A@ else echo F&enhum par;metroVH fi
c"se )+"l$r- i!
es"c
Pg. 7
'xemplos# case WA@W in start: echo =n WJniciando Samba daemons#W echo =n W nmbdW start=stop=daemon ==start ==quiet ==exec >usr>sbin>nmbd == =D<< stop: echo =n W!arando o Samba daemons# W start=stop=daemon ==stop ==quiet ==pidfile A&*(D!JD<< U: echo WSso# >etc>init d>samba _start`stop`reload`restart`force=reloadaW exit @ << esac
Exemplos:
BV>bin>bash B clear for i in @ N P L K do echo WCalor de iTAiW done
'xemplo# BV>bin>bash B clear let contTE .hile ] AB =gt E ^ do echo W!ar;metros passados T A@W shift let contTcontY@ done if ] Acont =eq E ^ then echo Wvoc1 no digitou par;metros W exit @ else echo Wvoc1 digitou Acont par;metros W fi exit
Exemplo#
BV>bin>bash B clear trap decho Coc1 digitou 2trl=2 < exit<d N trap decho Coc1 digitou 2trl=e< exit<d @R trap decho !rocesso saindo por =6S! < exit<d @ trap decho !rocesso saindo por fill< exit<d @K trap decho !rocesso saindo pelas pr4prias pernas 9exit E:< exit<d E .hile true do echo W-inda estou no ar AA W sleep P done
^011 C$#"!%$
re"U
Encerra um lao, do tipo .hile, until ou for, ap4s ! iteraes 3 padro para ! E 1 Sintaxe# re"U O!P
numTA& .hile ] A& =gt E ^ do let -T-U& let &T&=@ done echo WXatorial de Anum T W Aa clear echo =n W'ntre com um n%mero inteiro# W read & if ] xWA&W TT WxW ^ then let &TE fi fatorial A& exit
Pg. 12
Jnforma o n%mero de colunas do terminal< Jniciali,a o terminal com seus valores defaults< )impa a tela do terminal<
BV>bin>bash B clear tput bold tput cup NE NE < echo Sistema de 2adastro &ome=5elefone tput cup NN NE < echo ] @ ^ 2onsulta tput cup NP NE < echo ] N ^ -ltera tput cup NP PK < echo =n W3po ] ^W tput cup NP LP < read =n @ opc tput cup NP KE < echo 'scolhi a opo# Aopc
Pg. 13
Sg# $l$
8 : ; [ @ O"<cP OR<VP O[" cP /te(t$/ 0
T" el" %e E(pressaes Re6&l"res B=sic"s Cescri23$ -spas simples so utili,adas para delimitar o texto dentro delas como caracteres literais, no interpretando nenhum caractere como metacaractere -spas duplas so utili,adas para delimitar o texto dentro delas como caracteres literais, exceto os caracteres A e G 2ontra=barra utili,ada para informar que o caractere imediatamente posterior deve ser considerado como literal 3 acento circunflexo usado para indicar o incio de uma linha 3 cifro 9d4lar: usado para indicar o fim de uma linha Jndica que o intervalo de caracteres, de a at , so vlidos Jndica que qualquer n%mero de E 7 M so vlidos para a pesquisa 8ualquer caracter, menos a, b ou c so vlidos para a busca Jndica que texto procurado dever estar entre espaos 3 ponto decimal indica qualquer caracter menos uma linha em branco
-daptada do livro 2ertificao )inux, de Sir Dibeiro, 'dio NEEL, 'ditora 'xcel, pginas @EK e @EO
Ces"Mi$> El" $re &# script e# Shell *&e per#it" i!cl&ir9 e(cl&ir9 c$!s<"r e "lter"r &# re6istr$ c$!te!%$ !$#e e teleM$!e %e &#" pess$"0
Pg. 14
Comando # AB=$(ls -1 /etc/init.d) # [ x$VAR = x ] && echo Varivel VAR est vazia # tamAB=${#AB} # AB="Dez letras"
Descrio Executa o comando ls e guarda na varivel AB. Testa se a varivel VAR est vazia. Guarda o TAMANHO da varivel AB na varivel tamAB. Guarda o texto Dez letras na varivel AB Imprime, a partir do 5o caracter, mais 6 caracteres da varivel AB (inicia em 0 ). Testa se arquivo /etc/passwd no existe. Testa se prog1 um executvel. Testa se /etc um diretrio. Testa se passwd possui o bit Setuid setado. Troca espaos por _ da varivel AB e guarda na varivel AC Transforma varivel AB minsculas e guarda em AC. Transforma varivel AB maisculas e guarda em AC. Apaga a varivel AB. em em
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# echo ${AB:4:6} # [ ! -f /etc/passwd ] && echo Arq. passwd no existe # [ -f prog1 -a -x prog1 ] && echo um executvel # [ -d /etc -a -x /etc ] && echo um diretrio # [ -u /usr/bin/passwd ] && echo Possui Setuid # AC=$(echo $AB | tr [:blank:] ["_"]) # AC=$(echo $AB | tr [A-Z] [a-z]) # AC=$(echo $AB | tr [a-z] [A-Z]) # unset AB
# ech$ 1R01110/0J1 H "IU <K 0 8ipri!t @X :0h @J :0h Jmprime o J! Deverso @1 :0h @1j8 # find /usr -perm -4000 # find /var/log -size +1M | xargs ls -lah # find / -name *.iso # lsof -u daemon | awk '{print$2,$3,$9}' Lista arquivos do diretrio /usr com bit Suid setado. Lista arquivos com tamanho maior 1Megabytes do diretrio /var/log Procura arquivos .iso em toda a rvore de diretrios. Lista arquivos abertos pelo usurio daemon
# ps h -eo user,pid,pcpu,size,stat,cmd | sort -rn -k3 | Lista e classifica os 10 processos com mais utilizao de cpu. head -10 # find / -name "*.*~" | xargs rm -rf Procura e remove todos os arquivos que tenham o caracter ~ no final do seu nome.
20
Pg. 15