{"id":2812,"date":"2014-07-31T20:31:41","date_gmt":"2014-07-31T20:31:41","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=2812"},"modified":"2014-07-31T20:31:41","modified_gmt":"2014-07-31T20:31:41","slug":"httpwww-devin-com-brshell_script","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2014\/07\/31\/httpwww-devin-com-brshell_script\/","title":{"rendered":"http:\/\/www.devin.com.br\/shell_script\/"},"content":{"rendered":"<p>Programando em shell script<\/p>\n<p> Coment\u00e1rios  160 Visualiza\u00e7\u00f5es  509,824  489 4  7 57<\/p>\n<p>\u00cdndice de Conte\u00fado<br \/>\nPrimeira parte, uma introdu\u00e7\u00e3o<br \/>\nConceito de Vari\u00e1veis em shell script<br \/>\nControle de fluxo com o if<br \/>\nOutras alternativas<br \/>\nSegunda parte, se aprofundando mais!<br \/>\ncase<br \/>\nfor<br \/>\nwhile<br \/>\nuntil<br \/>\nUsando v\u00e1rios scripts em um s\u00f3<br \/>\nVari\u00e1veis especiais<br \/>\nFun\u00e7\u00f5es<br \/>\nExemplo Final<br \/>\nTerceira parte, janelas graficas<br \/>\nPrimeira parte, uma introdu\u00e7\u00e3o<\/p>\n<p>Quem usa Linux conhece bem o prompt de comando sh, ou varia\u00e7\u00f5es como o bash. O ue muita gente n\u00e3o sabe \u00e9 que o sh ou o bash t\u00eam uma \u201cpoderosa\u201d linguagem de script embutido nelas mesmas \u2013 shell script. Diversas pessoas utilizam-se desta linguagem para facilitar a realiza\u00e7\u00e3o de in\u00fameras tarefas administrativas no Linux, ou at\u00e9 mesmo criar seus pr\u00f3prios programinhas. Patrick Volkerding, criador da distribui\u00e7\u00e3o Slackware, utiliza esta linguagem para toda a instala\u00e7\u00e3o e configura\u00e7\u00e3o de sua distribui\u00e7\u00e3o. Voc\u00ea poder\u00e1 criar scripts para automar as tarefas di\u00e1rias de um servidor, para efetuar backup autom\u00e1tico regularmente, procurar textos, criar formata\u00e7\u00f5es, e muito mais. Para voc\u00ea ver como esta linguagem pode ser \u00fatil, vamos ver alguns passos introdut\u00f3rios sobre ela.<\/p>\n<p>Interpretadores de comandos s\u00e3o programas feitos para intermediar o usu\u00e1rio e seu sistema. Atrav\u00e9s destes interpretadores, o usu\u00e1rio manda um comando, e o interpretador o executa no sistema. Eles s\u00e3o a \u201cShell\u201d do sistema Linux. Usaremos o interpretador de comandos bash, por ser mais \u201cextenso\u201d que o sh, e para que haja uma melhor compreens\u00e3o das informa\u00e7\u00f5es obtidas aqui, \u00e9 bom ter uma base sobre o conceito de l\u00f3gica de programa\u00e7\u00e3o.<\/p>\n<p>Uma das vantagens destes shell scripts \u00e9 que eles n\u00e3o precisam ser compilados, ou seja, basta apenas criar um arquivo texto qualquer, e inserir comandos \u00e0 ele. Para dar \u00e0 este arquivo a defini\u00e7\u00e3o de \u201cshell script\u201d, teremos que incluir uma linha no come\u00e7o do arquivo (#!\/bin\/bash) e torn\u00e1-lo \u201cexecut\u00e1vel\u201d, utilizando o comando chmod. Vamos seguir com um pequeno exemplo de um shell script que mostre na tela: \u201cNossa! Estou vivo!\u201d:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n#!\/bin\/bash<br \/>\necho &#8216;Nossa! Estou vivo!&#8217;<br \/>\nF\u00e1cil, hein? A primeira linha indica que todas as outras linhas abaixo dever\u00e3o ser executadas pelo bash (que se localiza em \/bin\/bash), e a segunda linha imprimir\u00e1 na tela a frase \u201cNossa! Estou vivo!\u201d, utilizando o comando echo, que serve justamente para isto. Como voc\u00ea p\u00f4de ver, todos os comandos que voc\u00ea digita diretamente na linha de comando, voc\u00ea poder\u00e1 incluir no seu shell script, criando uma s\u00e9rie de comandos, e \u00e9 essa combina\u00e7\u00e3o de comandos que forma o chamado shell script. Tente tamb\u00e9m dar o comando \u2018file arquivo\u2019 e veja que a defini\u00e7\u00e3o dele \u00e9 de Bourne-Again Shell Script (bash script).<\/p>\n<p>Contudo, para o arquivo poder se execut\u00e1vel, voc\u00ea tem de atribuir o comando de execut\u00e1vel para ele. E como citamos anteriormente, o comando chmod se encarrega disto:<\/p>\n<p>$ chmod +x arquivo<br \/>\nPronto, o arquivo poder\u00e1 ser executado com um simples \u201c.\/arquivo\u201d.<\/p>\n<p>Conceito de Vari\u00e1veis em shell script<\/p>\n<p>Vari\u00e1veis s\u00e3o caracteres que armazenam dados, uma esp\u00e9cie de atalho. O bash reconhece uma vari\u00e1vel quando ela come\u00e7a com $, ou seja, a diferen\u00e7a entre \u2018palavra\u2019 e \u2018$palavra\u2019 \u00e9 que a primeira \u00e9 uma palavra qualquer, e a outra uma vari\u00e1vel. Para definir uma vari\u00e1vel, utilizamos a seguinte sintaxe:<\/p>\n<p>?<br \/>\n1<br \/>\nvariavel=&#8221;valor&#8221;<br \/>\nO \u2018valor\u2019 ser\u00e1 atribu\u00eddo a \u2018vari\u00e1vel \u2018. Valor pode ser uma frase, n\u00fameros, e at\u00e9 outras vari\u00e1veis e comandos. O valor pode ser expressado entre as aspas (\u201c\u201d), ap\u00f3strofos (\u201d) ou crases (\u201c). As aspas v\u00e3o interpretar as vari\u00e1veis que estiverem dentro do valor, os ap\u00f3strofos ler\u00e3o o valor literalmente, sem interpretar nada, e as crases v\u00e3o interpretar um comando e retornar a sua sa\u00edda para a vari\u00e1vel.<\/p>\n<p>Vejamos exemplos:<\/p>\n<p>$ variavel=&#8221;Eu estou logado como usu\u00e1rio $user&#8221;<br \/>\n$ echo $variavel<br \/>\nEu estou logado como usu\u00e1rio cla<\/p>\n<p>$ variavel=&#8217;Eu estou logado como usu\u00e1rio $user&#8217;<br \/>\n$ echo $variavel<br \/>\nEu estou logado como usu\u00e1rio $user<\/p>\n<p>$ variavel=&#8221;Meu diret\u00f3rio atual \u00e9 o `pwd`&#8221;<br \/>\n$ echo $variavel<br \/>\nMeu diret\u00f3rio atual \u00e9 o \/home\/cla<br \/>\nSe voc\u00ea quiser criar um script em que o usu\u00e1rio deve interagir com ele, \u00e9 poss\u00edvel que voc\u00ea queira que o pr\u00f3prio usu\u00e1rio defina uma vari\u00e1vel, e para isso usamos o comando read, que dar\u00e1 uma pausa no script e ficarar\u00e1 esperando o usu\u00e1rio digitar algum valor e teclar enter. Exemplo:<\/p>\n<p>echo &#8220;Entre com o valor para a vari\u00e1vel: &#8221; ; read variavel<br \/>\n(O usu\u00e1rio digita e tecla enter, vamos supor que ele digitou \u2018eu sou um frutinha\u2019)<\/p>\n<p>echo $variavel<br \/>\neu sou um frutinha<br \/>\nControle de fluxo com o if<\/p>\n<p>Controle de fluxo s\u00e3o comandos que v\u00e3o testando algumas alternativas, e de acordo com essas alternativas, v\u00e3o executando comandos. Um dos comandos de controle de fluxo mais usados \u00e9 certamente o if, que \u00e9 baseado na l\u00f3gica \u201cse acontecer isso, irei fazer isso, se n\u00e3o, irei fazer aquilo\u201d.<\/p>\n<p>Vamos dar um exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\nif [ -e $linux ]<br \/>\nthen<br \/>\n  echo &#8216;A vari\u00e1vel $linux existe.&#8217;<br \/>\nelse<br \/>\n  echo &#8216;A vari\u00e1vel $linux n\u00e3o existe.&#8217;<br \/>\nfi<br \/>\nO que este peda\u00e7o de c\u00f3digo faz? O if testa a seguinte express\u00e3o: Se a vari\u00e1vel $linux existir, ent\u00e3o (then) ele diz que que existe com o echo, se n\u00e3o (else), ele diz que n\u00e3o existe. O operador -e que usei \u00e9 pr\u00e9-definido, e voc\u00ea pode encontrar a listagem dos operadores na tabela:<\/p>\n<p>-eq\tIgual<br \/>\n-ne\tDiferente<br \/>\n-gt\tMaior<br \/>\n-lt\tMenor<br \/>\n-o\tOu<br \/>\n-d\tSe for um diret\u00f3rio<br \/>\n-e\tSe existir<br \/>\n-z\tSe estiver vazio<br \/>\n-f\tSe conter texto<br \/>\n-o\tSe o usu\u00e1rio for o dono<br \/>\n-r\tSe o arquivo pode ser lido<br \/>\n-w\tSe o arquivo pode ser alterado<br \/>\n-x\tSe o arquivo pode ser executado<br \/>\nOutras alternativas<\/p>\n<p>Existem in\u00fameros comandos no Linux, e para explicar todos, ter\u00edamos de publicar um verdadeiro livro. Mas existem outras possibilidades de aprendizado desta l\u00edngua, que tamb\u00e9m \u00e9 usado em todas as programa\u00e7\u00f5es. Primeiro de tudo voc\u00ea pode dar uma olhada na manpage do bash (comando man bash), que disponibilizar\u00e1 os comandos embutidos no interpretador de comandos. Uma das coisas essencias para o aprendizado \u00e9 sair coletando exemplos de outros scripts e ir estudando-os minuciosamente. Procure sempre comandos e express\u00f5es novas em outros scripts e em manpages dos comandos. E por \u00faltimo, mas n\u00e3o o menos importante, praticar bastante!<\/p>\n<p>Na tabela a seguir, voc\u00ea pode encontrar uma listagem de comandos para usar em seu shell script:<\/p>\n<p>echo\tImprime texto na tela<br \/>\nread\tCaptura dados do usu\u00e1rio e coloca numa vari\u00e1vel<br \/>\nexit\tFinaliza o script<br \/>\nsleep\tD\u00e1 uma pausa em segundos no script<br \/>\nclear\tLimpa a tela<br \/>\nstty\tConfigura o terminal temporariamente<br \/>\ntput\tAltera o modo de exibi\u00e7\u00e3o<br \/>\nif\tControle de fluxo que testa uma ou mais express\u00f5es<br \/>\ncase\tControle de fluxo que testa v\u00e1rias express\u00f5es ao mesmo tempo<br \/>\nfor\tControle de fluxo que testa uma ou mais express\u00f5es<br \/>\nwhile\tControle de fluxo que testa uma ou mais express\u00f5es<br \/>\nE assim seja, crie seus pr\u00f3prios scripts e facilite de uma vez s\u00f3 parte de sua vida no Linux!<\/p>\n<p>Segunda parte, se aprofundando mais!<\/p>\n<p>Falamos sobre o conceito da programa\u00e7\u00e3o em Shell Script, e demos o primeiro passo para construir nossos pr\u00f3prios scripts. Agora vamos nos aprofundar nos comandos mais complicados, aprendendo a fazer programas ainda mais \u00fateis. Nestes comandos est\u00e3o inclusos o case e os la\u00e7os for, while e until. Al\u00e9m disso, vamos falar de fun\u00e7\u00f5es e, por \u00faltimo, teremos um programa em shell script.<\/p>\n<p>case<\/p>\n<p>O case \u00e9 para controle de fluxo, tal como \u00e9 o if. Mas enquanto o if testa express\u00f5es n\u00e3o exatas, o case vai agir de acordo com os resultados exatos. Vejamos um exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\ncase $1 in<br \/>\n  parametro1) comando1 ; comando2 ;;<br \/>\n  parametro2) comando3 ; comando4 ;;<br \/>\n  *) echo &#8220;Voc\u00ea tem de entrar com um par\u00e2metro v\u00e1lido&#8221; ;;<br \/>\nesac<br \/>\nAqui aconteceu o seguinte: o case leu a vari\u00e1vel $1 (que \u00e9 o primeiro par\u00e2metro passado para o programa), e comparou com valores exatos. Se a vari\u00e1vel $1 for igual \u00e0 \u201cparametro1\u2033, ent\u00e3o o programa executar\u00e1 o comando1 e o comando2; se for igual \u00e0 \u201cparametro2\u2033, executar\u00e1 o comando3 e o comando4, e assim em diante. A \u00faltima op\u00e7\u00e3o (*), \u00e9 uma op\u00e7\u00e3o padr\u00e3o do case, ou seja, se o par\u00e2metro passado n\u00e3o for igual a nenhuma das outras op\u00e7\u00f5es anteriores, esse comando ser\u00e1 executado automaticamente.<\/p>\n<p>Voc\u00ea pode ver que, com o case fica muito mais f\u00e1cil criar uma esp\u00e9cie de \u201cmenu\u201d para o shell script do que com o if. Vamos demonstrar a mesma fun\u00e7\u00e3o anterior, mas agora usando o if:<\/p>\n<p>?<br \/>\n01<br \/>\n02<br \/>\n03<br \/>\n04<br \/>\n05<br \/>\n06<br \/>\n07<br \/>\n08<br \/>\n09<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\nif [ -z $1 ]; then<br \/>\n  echo &#8220;Voc\u00ea tem de entrar com um par\u00e2metro v\u00e1lido&#8221;<br \/>\n  exit<br \/>\nelif [ $1 = &#8220;parametro1&#8221; ]; then<br \/>\n  comando1<br \/>\n  comando2<br \/>\nelif [ $1 = &#8220;parametro2&#8221; ]; then<br \/>\n  comando3<br \/>\n  comando4<br \/>\nelse<br \/>\n  echo &#8220;Voc\u00ea tem de entrar com um par\u00e2metro v\u00e1lido&#8221;<br \/>\nfi<br \/>\nVeja a diferen\u00e7a. \u00c9 muito mais pr\u00e1tico usar o case! A vantagem do if \u00e9 que ele pode testar v\u00e1rias express\u00f5es que o case n\u00e3o pode. O case \u00e9 mais pr\u00e1tico, mas o if pode substitu\u00ed-lo e ainda abrange mais fun\u00e7\u00f5es. Note que, no exemplo com o if, citamos um \u201ccomando\u201d n\u00e3o visto antes: o elif \u2013 que \u00e9 uma combina\u00e7\u00e3o de else e if. Ao inv\u00e9s de fechar o if para criar outro, usamos o elif para testar uma express\u00e3o no mesmo comando if.<\/p>\n<p>for<\/p>\n<p>O la\u00e7o for vai substituindo uma vari\u00e1vel por um valor, e vai executando os comandos pedidos. Veja o exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\nfor i in *<br \/>\ndo<br \/>\n  cp $i $i.backup<br \/>\n  mv $i.backup \/usr\/backup<br \/>\ndone<br \/>\nPrimeiramente o la\u00e7o for atribuiu o valor de retorno do comando \u201c*\u201d (que \u00e9 equivalente a um ls sem nenhum par\u00e2metro) para a vari\u00e1vel $i, depois executou o bloco de comandos. Em seguida ele atribui outro valor do comando \u201c*\u201d para a vari\u00e1vel $1 e reexecutou os comandos. Isso se repete at\u00e9 que n\u00e3o sobrem valores de retorno do comando \u201c*\u201d. Outro exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\nfor original in *; do<br \/>\n  resultado=`echo $original |<br \/>\n             tr &#8216;[:upper:]&#8217; &#8216;[:lower:]&#8217;`<\/p>\n<p>  if [ ! -e $resultado ]; then<br \/>\n    mv $original $resultado<br \/>\n  fi<br \/>\ndone<br \/>\nAqui, o que ocorre \u00e9 a transforma\u00e7\u00e3o de letras mai\u00fasculas para min\u00fasculas. Para cada arquivo que o la\u00e7o l\u00ea, uma vari\u00e1vel chamada $resultado ir\u00e1 conter o arquivo em letras min\u00fasculas. Para transformar em letras min\u00fasculas, usei o comando tr. Caso n\u00e3o exista um arquivo igual e com letras min\u00fasculas, o arquivo \u00e9 renomeado para o valor da vari\u00e1vel $resultado, de mesmo nome, mas com letras min\u00fasculas.<\/p>\n<p>Como os exemplos ilustram, o la\u00e7o for pode ser bem \u00fatil no tratamento de m\u00faltiplos arquivos. Voc\u00ea pode deix\u00e1-los todos com letras min\u00fasculas ou mai\u00fasculas sem precisar renomear cada um manualmente, pode organizar dados, fazer backup, entre outras coisas.<\/p>\n<p>while<\/p>\n<p>O while testa continuamente uma express\u00e3o, at\u00e9 que ela se torne falsa. Exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\nvariavel=&#8221;valor&#8221;<br \/>\nwhile [ $variavel = &#8220;valor&#8221; ]; do<br \/>\n  comando1<br \/>\n  comando2<br \/>\ndone<br \/>\nO que acontece aqui \u00e9 o seguinte: enquanto a \u201c$variavel\u201d for igual a \u201cvalor\u201d, o while ficar\u00e1 executando os comandos 1 e 2, at\u00e9 que a \u201c$variavel\u201d n\u00e3o seja mais igual a \u201cvalor\u201d. Se no bloco dos comandos a \u201c$variavel\u201d mudasse, o while iria parar de executar os comandos quando chegasse em done, pois agora a express\u00e3o $variavel = \u201cvalor\u201d n\u00e3o seria mais verdadeira.<\/p>\n<p>until<\/p>\n<p>Tem as mesmas caracter\u00edsticas do while, a \u00fanica diferen\u00e7a \u00e9 que ele faz o contr\u00e1rio. Veja o exemplo abaixo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\nvariavel=&#8221;naovalor&#8221;<br \/>\nuntil [ $variavel = &#8220;valor&#8221; ]; do<br \/>\n  comando1<br \/>\n  comando2<br \/>\ndone<br \/>\nAo inv\u00e9s de executar o bloco de comandos (comando1 e comando2) at\u00e9 que a express\u00e3o se torne falsa, o until testa a express\u00e3o e executa o bloco de comandos at\u00e9 que a express\u00e3o se torne verdadeira. No exemplo, o bloco de comandos ser\u00e1 executado desde que a express\u00e3o $variavel = \u201cvalor\u201d n\u00e3o seja verdadeira. Se no bloco de comandos a vari\u00e1vel for definida como \u201cvalor\u201d, o until p\u00e1ra de executar os comandos quando chega ao done.<\/p>\n<p>Vejamos um exemplo para o until que, sintaticamente invertido, serve para o while tamb\u00e9m:<\/p>\n<p>?<br \/>\n01<br \/>\n02<br \/>\n03<br \/>\n04<br \/>\n05<br \/>\n06<br \/>\n07<br \/>\n08<br \/>\n09<br \/>\n10<br \/>\nvar=1<br \/>\ncount=0<br \/>\nuntil [ $var = &#8220;0&#8221; ]; do<br \/>\n  comando1<br \/>\n  comando2<br \/>\n  if [ $count = 9 ]; then<br \/>\n    var=0<br \/>\n  fi<br \/>\n  count=`expr $count + 1`<br \/>\ndone<br \/>\nPrimeiro, atribu\u00edmos \u00e0 vari\u00e1vel \u201c$var\u201d o valor \u201c1\u2033. A vari\u00e1vel \u201c$count\u201d ser\u00e1 uma contagem para quantas vezes quisermos executar o bloco de comandos. O until executa os comandos 1 e 2, enquanto a vari\u00e1vel \u201c$var\u201d for igual a \u201c0\u2033. Ent\u00e3o usamos um if para atribuir o valor 0 para a vari\u00e1vel \u201c$var\u201d, se a vari\u00e1vel \u201c$count\u201d for igual a 9. Se a vari\u00e1vel \u201c$count\u201d n\u00e3o for igual a 0, soma-se 1 a ela. Isso cria um la\u00e7o que executa o comando 10 vezes, porque cada vez que o comando do bloco de comandos \u00e9 executado, soma-se 1 \u00e0 vari\u00e1vel \u201c$count\u201d, e quando chega em 9, a vari\u00e1vel \u201c$var\u201d \u00e9 igualada a zero, quebrando assim o la\u00e7o until.<\/p>\n<p>Usando v\u00e1rios scripts em um s\u00f3<\/p>\n<p>Pode-se precisar criar v\u00e1rios scripts shell que fazem fun\u00e7\u00f5es diferentes, mas, e se voc\u00ea precisar executar em um script shell um outro script externo para que este fa\u00e7a alguma fun\u00e7\u00e3o e n\u00e3o precisar reescrever todo o c\u00f3digo? \u00c9 simples, voc\u00ea s\u00f3 precisa incluir o seguinte comando no seu script shell:<\/p>\n<p>?<br \/>\n1<br \/>\n. bashscript2<br \/>\nIsso executar\u00e1 o script shell \u201cbashscript2\u2033 durante a execu\u00e7\u00e3o do seu script shell. Neste caso ele ser\u00e1 executado na mesma script shell em que est\u00e1 sendo usado o comando. Para utilizar outra shell, voc\u00ea simplesmente substitui o \u201c.\u201d pelo execut\u00e1vel da shell, assim:<\/p>\n<p>sh script2<br \/>\ntcsh script3<br \/>\nNessas linhas o script2 ser\u00e1 executado com a shell sh, e o script3 com a shell tcsh.<\/p>\n<p>Vari\u00e1veis especiais<\/p>\n<p>$0\tNome do script que est\u00e1 sendo executado<br \/>\n$1-$9\tPar\u00e2metros passados \u00e0 linha de comando<br \/>\n$#\tN\u00famero de par\u00e2metros passados<br \/>\n$?\tValor de retorno do \u00faltimo comando ou de todo o shell script. (o comando \u201cexit 1\u2033 retorna o valor 1)<br \/>\n$$\tN\u00famero do PID (Process ID)<br \/>\nVoc\u00ea tamb\u00e9m encontra muitas vari\u00e1veis, j\u00e1 predefinidas, na p\u00e1gina de manual do bash (comando \u201cman bash\u201d, se\u00e7\u00e3o Shell Variables).<\/p>\n<p>Fun\u00e7\u00f5es<\/p>\n<p>Fun\u00e7\u00f5es s\u00e3o blocos de comandos que podem ser definidos para uso posterior em qualquer parte do c\u00f3digo. Praticamente todas as linguagens usam fun\u00e7\u00f5es que ajudam a organizar o c\u00f3digo. Vejamos a sintaxe de uma fun\u00e7\u00e3o:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\nfuncao() {<br \/>\n  comando1<br \/>\n  comando2<br \/>\n  [&#8230;]<br \/>\n}<br \/>\nF\u00e1cil de entender, n\u00e3o? A fun\u00e7\u00e3o funcionar\u00e1 como um simples comando pr\u00f3prio. Voc\u00ea executa a fun\u00e7\u00e3o em qualquer lugar do script shell, e os comandos 1, 2 e outros ser\u00e3o executados. A flexibilidade das fun\u00e7\u00f5es permite facilitar a vida do programador, como no exemplo final.<\/p>\n<p>Exemplo Final<\/p>\n<p>Agora vamos dar um exemplo de um programa que utilize o que aprendemos com os artigos.<\/p>\n<p>?<br \/>\n01<br \/>\n02<br \/>\n03<br \/>\n04<br \/>\n05<br \/>\n06<br \/>\n07<br \/>\n08<br \/>\n09<br \/>\n10<br \/>\n11<br \/>\n12<br \/>\n13<br \/>\n14<br \/>\n15<br \/>\n16<br \/>\n17<br \/>\n18<br \/>\n19<br \/>\n20<br \/>\n21<br \/>\n22<br \/>\n23<br \/>\n24<br \/>\n25<br \/>\n26<br \/>\n27<br \/>\n28<br \/>\n29<br \/>\n30<br \/>\n31<br \/>\n32<br \/>\n33<br \/>\n34<br \/>\n35<br \/>\n36<br \/>\n37<br \/>\n38<br \/>\n39<br \/>\n40<br \/>\n41<br \/>\n42<br \/>\n43<br \/>\n44<br \/>\n45<br \/>\n46<br \/>\n47<br \/>\n48<br \/>\n49<br \/>\n50<br \/>\n51<br \/>\n52<br \/>\n53<br \/>\n54<br \/>\n55<br \/>\n56<br \/>\n57<br \/>\n58<br \/>\n59<br \/>\n60<br \/>\n61<br \/>\n62<br \/>\n63<br \/>\n64<br \/>\n65<br \/>\n66<br \/>\n67<br \/>\n68<br \/>\n69<br \/>\n70<br \/>\n71<br \/>\n72<br \/>\n73<br \/>\n74<br \/>\n75<br \/>\n76<br \/>\n77<br \/>\n78<br \/>\n79<br \/>\n#!\/bin\/bash<br \/>\n# Exemplo Final de Script Shell<br \/>\n#<\/p>\n<p>Principal() {<br \/>\n  echo &#8220;Exemplo Final sobre o uso de scripts shell&#8221;<br \/>\n  echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br \/>\n  echo &#8220;Op\u00e7\u00f5es:&#8221;<br \/>\n  echo<br \/>\n  echo &#8220;1. Trasformar nomes de arquivos&#8221;<br \/>\n  echo &#8220;2. Adicionar um usu\u00e1rio no sistema&#8221;<br \/>\n  echo &#8220;3. Deletar um usu\u00e1rio no sistema&#8221;<br \/>\n  echo &#8220;4. Fazer backup dos arquivos do \/etc&#8221;<br \/>\n  echo &#8220;5. Sair do exemplo&#8221;<br \/>\n  echo<br \/>\n  echo -n &#8220;Qual a op\u00e7\u00e3o desejada? &#8221;<br \/>\n  read opcao<br \/>\n  case $opcao in<br \/>\n    1) Transformar ;;<br \/>\n    2) Adicionar ;;<br \/>\n    3) Deletar ;;<br \/>\n    4) Backup ;;<br \/>\n    5) exit ;;<br \/>\n    *) &#8220;Op\u00e7\u00e3o desconhecida.&#8221; ; echo ; Principal ;;<br \/>\n  esac<br \/>\n}<\/p>\n<p>Transformar() {<br \/>\n  echo -n &#8220;Para Mai\u00fasculo ou min\u00fasculo? [M\/m] &#8221;<br \/>\n  read var<br \/>\n  if [ $var = &#8220;M&#8221; ]; then<br \/>\n    echo -n &#8220;Que diret\u00f3rio? &#8221;<br \/>\n    read dir<\/p>\n<p>    for x in `\/bin\/ls` $dir; do<br \/>\n      y=`echo $x | tr &#8216;[:lower:]&#8217; &#8216;[:upper:]&#8217;`<br \/>\n      if [ ! -e $y ]; then<br \/>\n        mv $x $y<br \/>\n      fi<br \/>\n    done<\/p>\n<p>  elif [ $var = &#8220;m&#8221; ]; then<br \/>\n    echo -n &#8220;Que diret\u00f3rio? &#8221;<br \/>\n    read dir<\/p>\n<p>    for x in `\/bin\/ls` $dir; do<br \/>\n      y=`echo $x | tr &#8216;[:upper:]&#8217; &#8216;[:lower:]&#8217;`<br \/>\n      if [ ! -e $y ]; then<br \/>\n        mv $x $y<br \/>\n      fi<br \/>\n    done<\/p>\n<p>  fi<br \/>\n}<\/p>\n<p>Adicionar() {<br \/>\n  clear<br \/>\n  echo -n &#8220;Qual o nome do usu\u00e1rio a se adicionar? &#8221;<br \/>\n  read nome<br \/>\n  adduser nome<br \/>\n  Principal<br \/>\n}<\/p>\n<p>Deletar() {<br \/>\n  clear<br \/>\n  echo -n &#8220;Qual o nome do usu\u00e1rio a deletar? &#8221;<br \/>\n  read nome<br \/>\n  userdel nome<br \/>\n  Principal<br \/>\n}<\/p>\n<p>Backup() {<br \/>\n  for x in `\/bin\/ls` \/etc; do<br \/>\n    cp -R \/etc\/$x \/etc\/$x.bck<br \/>\n    mv \/etc\/$x.bck \/usr\/backup<br \/>\n  done<br \/>\n}<\/p>\n<p>Principal<br \/>\nTerceira parte, janelas graficas<\/p>\n<p>Nos dois topicos anteriores, vimos algumas coisas b\u00e1sicas e l\u00f3gicas de programa\u00e7\u00e3o em shell no Linux. Agora para completar, darei aqui dicas de como usar janelas gr\u00e1ficas em seus shell scripts. Isso mesmo, janelas que rodam no ambiente gr\u00e1fico, utilizadas facilmente em seu shell script. Com esse recurso, vai ser poss\u00edvel deixar o seu programa bem amig\u00e1vel.<\/p>\n<p>N\u00e3o vai ser preciso saber muita coisa de programa\u00e7\u00e3o em shell, pois \u00e9 muito simples. Atrav\u00e9s do programa Xdialog, voc\u00ea poder\u00e1 criar os mais variados tipos de janelas para o programa: caixas de texto, sele\u00e7\u00d5es, radios, etc. O Xdialog \u00e9 uma id\u00e9ia que vem do dialog\/cdialog, um programa para console que gera \u201cjanelas\u201d no console (aquelas da instala\u00e7\u00e3o do Slackware) usando a biblioteca ncurses. O Xdialog ao inv\u00e9s de usar a biblioteca ncurses, usa a Xlib para criar as janelas no ambiente gr\u00e1fico.<\/p>\n<p>Primeiro de tudo ser\u00e1 necess\u00e1rio voc\u00ea obter o Xdialog no seu sistema. N\u00e3o \u00e9 comum o Xdialog estar incluso nas distribui\u00e7\u00f5es, ent\u00e3o voc\u00ea ter\u00e1 de pegar e compilar o programa. Obtenha o programa no CD da Revista ou visite o endere\u00e7o oficial do Xdialog, que \u00e9 http:\/\/xdialog.free.fr. Aqui eu peguei o arquivo Xdialog-1.4.5.tar.bz2, e agora vamos aos passos b\u00e1sicos para instalar ele. Primeiro descompacte-o com o comando bunzip2 Xdialog-1.4.5.tar.bz2, e logo em seguida tar xpvf Xdialog-1.4.5.tar. Um diret\u00f3rio chamado Xdialog-1.4.5 ser\u00e1 criado, e entrando nele voc\u00ea estar\u00e1 pronto para compil\u00e1-lo e instal\u00e1-lo. Para fazer isso use os comandos .\/configure, depois make e por \u00faltimo make install. No passo do make install, o bin\u00e1rio do Xdialog ser\u00e1 colocado em \/usr\/local\/bin. Pronto, agora voc\u00ea j\u00e1 poder\u00e1 utilizar o Xdialog atrav\u00e9s de qualquer shell script.<\/p>\n<p>E agora vamos \u00e0 a\u00e7\u00e3o! Como aprendemos nos artigos anteriores, em shell script \u00e9 s\u00f3 colocar o comando dentro do arquivo que ele j\u00e1 vai ser executado quando o script for executado. Ent\u00e3o s\u00f3 o que temos de aprender aqui \u00e9 como usar o Xdialog. Vamos ver um primeiro exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n#!\/bin\/bash<\/p>\n<p>Xdialog &#8211;title &#8220;Exemplo n\u00famero 1!&#8221; &#8211;center &#8211;stdout &#8211;yesno \\<br \/>\n&#8220;Isto \u00e9 legal?&#8221; \\<br \/>\n0 0<\/p>\n<p>echo $?<br \/>\nComo voc\u00ea p\u00f4de ver, o programa Xdialog gerou uma janela com t\u00edtulo \u201cExemplo n\u00famero 1!\u201d, perguntando \u201cIsto \u00e9 legal?\u201d e com op\u00e7\u00f5es de Sim e N\u00e3o. Note que a \\ (barra) serve para indicar \u00e0 shell para continuar o comando da linha seguinte, ent\u00e3o estas tr\u00eas linhas s\u00e3o que nem uma s\u00f3. Como \u00faltimo comando do exemplo dado, temos o echo $?, que eu coloquei apenas para indicar qual foi o retorno da pergunta. Caso o usu\u00e1rio apertou em Sim, o retorno vai ser 0, e se apertou em N\u00e3o, vai ser 1. Podemos usar este retorno para controlar o que o usu\u00e1rio escolher. Vejamos um exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<br \/>\nXdialog &#8211;title &#8220;Exemplo n\u00famero 2!&#8221; &#8211;center &#8211;stdout &#8211;yesno \\<br \/>\n&#8220;Neste exemplo, vamos ver o que voc\u00ea quer fazer. Voc\u00ea deseja continuar com o programa?&#8221; \\<br \/>\n0 0<\/p>\n<p>if [ $? = &#8220;0&#8221; ]; then<br \/>\n  echo &#8220;Que bom! Voc\u00ea continuou o programa! Parab\u00e9ns!&#8221;<br \/>\nelif [ $? = &#8220;1&#8221; ]; then<br \/>\n  echo &#8220;Voc\u00ea saiu do programa&#8230;&#8221;<br \/>\nfi<br \/>\nViu como funciona? Agora vamos ver outros recursos que o Xdialog pode oferecer. Eu vou dar v\u00e1rios exemplos aqui e sair comentando cada op\u00e7\u00e3o. Voc\u00ea precisar\u00e1 praticar bastante e conhecer as v\u00e1rias op\u00e7\u00f5es. Primeiro vamos gerar uma simples mensagem pro usu\u00e1rio ver:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\nXdialog &#8211;title &#8220;Aviso&#8221; &#8211;center &#8211;stdout &#8211;msgbox \\<br \/>\n&#8220;Este programa \u00e9 apenas um exemplo para voc\u00ea ver como o Xdialog \\<br \/>\n\\nfunciona. Aprop\u00f3sito, se voc\u00ea praticar bastante pode criar \\<br \/>\n\\nprogra mas incr\u00edveis e facilmente, que daria muito mais \\<br \/>\n\\ntrabalho fazendo em outras linguagens.&#8221; \\<br \/>\n0 0<br \/>\nO usu\u00e1rio aperta Ok e o shell script continua normalmente. No primeiro exemplo eu usei a op\u00e7\u00e3o \u2013yesno que gerava o sim e n\u00e3o. Agora usei o \u2013msgbox. Mas e se voc\u00ea quiser que o usu\u00e1rio digite algo e isto seja gravado em um arquivo por exemplo? Vamos ver este exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\nXdialog &#8211;title &#8220;Que Anime que voc\u00ea mais gosta?&#8221; &#8211;center &#8211;inputbox \\<br \/>\n&#8220;Se voc\u00ea sabe o que \u00e9 Anime, e gosta, qual o seu preferido?\\n \\<br \/>\n Sua resposta ser\u00e1 gravada no arquivo resposta.&#8221; \\<br \/>\n0 0 2 > resposta<br \/>\nDepois que o usu\u00e1rio preenche o campo e d\u00e1 Ok, a resposta que este usu\u00e1rio digitou ser\u00e1 gravada no arquvio resposta. Isto ocorreu pelo fato de eu ter colocado o direcionador 2> para o arquivo resposta. Se eu colocasse a op\u00e7\u00e3o \u2013stdout na linha de comando do Xdialog, a resposta do usu\u00e1rio apareceria na tela. Tente voc\u00ea.<\/p>\n<p>Vamos ver agora sele\u00e7\u00e3o de itens, que \u00e9 uma das coisas mais importantes num programa. Desta vez usaremos a op\u00e7\u00e3o \u2013menubox para gerar um menu com os itens a serem selecionados. Mais uma vez, vamos ao exemplo:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\nXdialog &#8211;title &#8220;Exemplo de Menu&#8221; &#8211;center &#8211;stdout &#8211;menubox \\<br \/>\n&#8220;Qual sua distribui\u00e7\u00e3o Linux favorita?&#8221; \\<br \/>\n20 50 0 \\<br \/>\n1 &#8220;Slackware&#8221; \\<br \/>\n2 &#8220;Debian&#8221; \\<br \/>\n3 &#8220;Red Hat&#8221; \\<br \/>\n4 &#8220;Conectiva Linux&#8221; \\<br \/>\n5 &#8220;Eu tenho minha pr\u00f3pria distribui\u00e7\u00e3o&#8221;<br \/>\nViu como \u00e9 f\u00e1cil? O que o usu\u00e1rio escolher vai aparecer como resultado no console (por causa da op\u00e7\u00e3o \u2013stdout). Se eu colocasse o redirecionador 2>, poderia ir para um arquivo como no exemplo anterior. Vamos esclarecer uma coisa aqui tamb\u00e9m\u2026 Depois do texto \u201cQual sua distribui\u00e7\u00e3o Linux favorita?\u201d, h\u00e1 2 n\u00fameros. Estes dois n\u00fameros correspondem \u00e0 altura e comprimento da janela. Nos exemplos anteriores eu coloquei \u201c0 0\u2033 pois a\u00ed o Xdialog dimensiona automaticamente o tamanho da janela. Ent\u00e3o j\u00e1 sabe, se quiser mudar o tamanho da janela, \u00e9 s\u00f3 mudar estes dois n\u00fameros.<\/p>\n<p>Agora como \u00faltimo exemplo, vamos criar uma janela em que o usu\u00e1rio poder\u00e1 escolher uma ou mais op\u00e7\u00f5es. Isto \u00e9 chamado de checklist, e pode ser visto no exemplo a seguir:<\/p>\n<p>?<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\nXdialog &#8211;title &#8220;\u00daltimo exemplo &#8211; checklist&#8221; &#8211;center &#8211;checklist \\<br \/>\n&#8220;Como se pronuncia Linux?&#8221; \\<br \/>\n0 0 0 \\<br \/>\n&#8220;Op\u00e7\u00e3o 1&#8221; &#8220;L\u00e1inucs&#8221; off \\<br \/>\n&#8220;Op\u00e7\u00e3o 2&#8221; &#8220;Lenocs&#8221; off \\<br \/>\n&#8220;Op\u00e7\u00e3o 3&#8221; &#8220;Lin\u00facs&#8221; off \\<br \/>\n&#8220;Op\u00e7\u00e0o 4&#8221; &#8220;L\u00ednucs&#8221; on \\<br \/>\n&#8220;Op\u00e7\u00e3o 5&#8221; &#8220;GNUUU\/Linux&#8221; off<br \/>\nVeja agora a diferen\u00e7a entre esta checklist e o menu do exemplo anterior. Verifique que depois de cada op\u00e7\u00e3o h\u00e1 o on e o off. O on indica que esta op\u00e7\u00e3o dever\u00e1 j\u00e1 estar marcada, e o off que n\u00e3o dever\u00e1 estar marcada. Se o usu\u00e1rio escolher 3 op\u00e7\u00f5es, as mesmas ser\u00e3o o resultado.<\/p>\n<p>Bem f\u00e1cil criar uma interface amig\u00e1vel para suas shell scripts. Se voc\u00ea pensa que isto \u00e9 tudo, ainda tem muito mais por tr\u00e1s do Xdialog. Para n\u00e3o ter que ficar comentando cada op\u00e7\u00e3o, vou dar uma lista de par\u00e2metros e a descri\u00e7\u00e3o de suas fun\u00e7\u00f5es. O que voc\u00ea dever\u00e1 fazer \u00e9 sair testando todas as op\u00e7\u00f5es e se impressionar \ud83d\ude42<\/p>\n<p>\u2013yesno\tUma janela com op\u00e7\u00f5es de \u201cSim\u201d ou \u201cN\u00e3o\u201d<br \/>\n\u2013msgbox\tApenas mostra um texto informativo<br \/>\n\u2013infobox\tMesmo que \u2013msgbox, s\u00f3 que desaparece automaticamente em um determinado tempo<br \/>\n\u2013inputbox\tO usu\u00e1rio preenche um campo<br \/>\n\u2013rangebox\tEscolhe um n\u00famero entre X e Y, com uma barra de rolagem<br \/>\n\u2013textbox\tMostra o conte\u00fado de um arquivo numa caixa de texto<br \/>\n\u2013editbox\tEdita o conte\u00fado de um arquivo numa caixa de texto<br \/>\n\u2013menubox\tCria um Menu de op\u00e7\u00f5es, onde se seleciona um item<br \/>\n\u2013checklist\tMesmo que \u2013menubox, s\u00f3 que pode-se selecionar v\u00e1rios itens<br \/>\n\u2013radiolist\tMesmo que \u2013menubox, mas agora em outro estilo<br \/>\n\u2013treeview\tOp\u00e7\u00f5es organizadas em forma de \u201c\u00e1rvore\u201d (interessante)<br \/>\n\u2013gauge\tUm indicador de processo<br \/>\n\u2013tailbox\tMostra o conte\u00fado de um arquivo<br \/>\n\u2013fselect\tAbre uma janela de sele\u00e7\u00e3o de um arquivo<br \/>\n\u2013dselect\tAbre uma janela de sele\u00e7\u00e3o de um diret\u00f3rio<br \/>\n\u2013calendar\tMostra um calend\u00e1rio para escolher uma data<br \/>\n\u2013timebox\tMostra uma janela para edi\u00e7\u00e3o de hor\u00e1rio<br \/>\nVoc\u00ea tamb\u00e9m pode encontrar alguns exemplos no diret\u00f3rio samples que vem junto com o c\u00f3digo-fonte do programa. Se voc\u00ea fizer algum programa legal em shell script, sinta-se a vontade para me mandar um e-mail. Outra coisa, como o Xdialog \u00e9 uma id\u00e9ia tirada do dialog\/cdialog (existe tamb\u00e9m o whiptail que \u00e9 parecido), voc\u00ea pode usar a mesma sintaxe para criar estas \u201cjanelas\u201d no modo console. Espero que estas informa\u00e7\u00f5es foram \u00fateis a voc\u00ea e at\u00e9 a pr\u00f3xima \ud83d\ude42<\/p>\n<p>&#8211; See more at: http:\/\/www.devin.com.br\/shell_script\/#sthash.qarQADVV.dpuf<\/p>\n<blockquote class=\"wp-embedded-content\" data-secret=\"JvMxEL5FrT\"><p><a href=\"https:\/\/www.devin.com.br\/shell_script\/\">Programando em shell script<\/a><\/p><\/blockquote>\n<p><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Programando em shell script&#8221; &#8212; Devin\" src=\"https:\/\/www.devin.com.br\/shell_script\/embed\/#?secret=jDDSurncuo#?secret=JvMxEL5FrT\" data-secret=\"JvMxEL5FrT\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programando em shell script Coment\u00e1rios 160 Visualiza\u00e7\u00f5es 509,824 489 4 7 57 \u00cdndice de Conte\u00fado Primeira parte, uma introdu\u00e7\u00e3o Conceito de Vari\u00e1veis em shell script Controle de fluxo com o if Outras alternativas Segunda parte, se aprofundando mais! case for while until Usando v\u00e1rios scripts&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[16],"tags":[],"class_list":["post-2812","post","type-post","status-publish","format-standard","hentry","category-shell"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=2812"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2812\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=2812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=2812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=2812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}