Programando em Shell Script para iniciantes

Este é meu primeiro artigo, mas estudei bastante para fazê-lo. Ele foi desenvolvido principalmente para aqueles que querem começar nesse mundo fascinante da programação. Estudaremos os princípios do Shell Script e iremos até os diálogos gráficos.

[ Hits: 209.219 ]

Por: Lemuel Roberto em 27/10/2007 | Blog: https://blog.lemuelroberto.online/


Zenity



Esse diálogo é padrão no ambiente gráfico GNOME e tem como objetivo ser limpo e leve. É bem semelhante aos outros diálogos citados anteriormente.

Instalação:

Se você usa uma distribuição baseada no Debian é só digitar "sudo apt-get install zenity" num terminal.

Se você deseja instalar manualmente, baixe o zenity aqui.

Vá a um terminal e digite os comandos em seqüência:

$ tar zenity-2.20.0.tar.gz
$ cd zenity-2.20.0
$ ./configure
$ make
# make install


Chega de conversa e vamos estudar.

#!/bin/sh

zenity --title="Criando diretório" --file-selection --directory > /tmp/caminho.tmp
if [ $? != 0 ]; then
   zenity --title="Criando diretório" --warning --text="Entre com um caminho válido."
   exit 0
fi
caminho=`cat /tmp/caminho.tmp`

zenity --title="Criando diretório" --entry --text="Digite o nome do diretório que deseja criar." > /tmp/diretorio.tmp
if [ $? != 0 ]; then
   zenity --title="Criando diretório" --warning --text="Entre com um nome válido."
   exit 0
fi
diretorio=`cat /tmp/diretorio.tmp`

if [ -e $caminho ]; then
   mkdir -p "$caminho/$diretorio"
   zenity --title="Criando diretório" --info --text="O diretório $diretorio foi criado."
else
   zenity --title="Criando diretório" --error --text="Ocorreu um erro inesperado."
fi

Entendendo o que você criou:
  • zenity : abre um diálogo;
  • --title= : define o título do diálogo;
  • --text= : define o texto da caixa de diálogo;
  • --file-selection : abre um diálogo que seleciona um arquivo;
  • --directory : age em conjunto com a sintaxe "--file-selection", fazendo com que selecione apenas diretório;
  • if [ $? != 0 ]; : se a operação anterior for cancelada, ela vai gerar uma variável igual a "1", então seguirá com os comandos subseqüentes;
  • --warning : abre um diálogo de alerta;
  • --info : abre um diálogo de mensagem;
  • --error : exibe uma mensagem de erro.

Tipos de diálogo do "Zenity":

Opções comuns a todos os tipo de diálogos:
  • "--title=TÍTULO" define o título do diálogo;
  • "--window-icon=CAMINHODOÍCONE" define o ícone da janela;
  • "--width=LARGURA" define a largura;
  • "--height=ALTURA" define a altura.

Opções referentes a "--calendar", que abre um calendário:
  • "--text=TEXTO" define o texto do diálogo;
  • "--day=DIA" define o dia do calendário;
  • "--month=MÊS" define o mês do calendário;
  • "--year=ANO" define o ano do calendário;
  • "--date-format=MODELO" define o formato para a data devolvida.

Opções referentes a "--entry", que abre um diálogo semelhante ao "--inputbox" do "kdialog":
  • "--text=TEXTO" define o texto do diálogo;
  • "--entry-text=TEXTO" define o texto introduzido;
  • "--hide-text=TEXTO" esconde o texto introduzido.

Opções referentes ao diálogo de erro ("--error"):
  • "--text=TEXTO" define o texto do diálogo;
  • "--no-wrap" não habilitar quebra de linha no texto.

Opções pertinentes ao diálogo de informação ("--info"):
  • "--text=TEXTO" define o texto do diálogo;
  • "--no-wrap" para não habilitar quebra de linha no texto.

Opções referentes ao diálogo de seleção de arquivos ("--file-selection"):
  • "--filename=NOMEDOARQUIVO" define o nome do arquivo;
  • "--multiple" permite a seleção de múltiplos arquivos;
  • "--directory" ativa apenas seleção de diretórios;
  • "--save" ativa o modo salvar;
  • "--separator=SEPARADOR" define o caractere separador de saída;
  • "--confirm-overwrite" confirma a seleção do arquivo se o nome do arquivo já existe.

As opções seguintes são referentes a "--list", que mostra um diálogo com uma lista de opções:
  • "--text=TEXTO" define o texto do diálogo;
  • "--column=COLUNA" define o cabeçalho da coluna;
  • "--checklist" apresenta caixas de seleção, ou seja, podem ser escolhidas várias opções simultaneamente;
  • "--radiolist" mostra botões de seleção, ou seja, só pode ser escolhida uma única opção;
  • "--separator=SEPARADOR" define caractere separador de saída;
  • "--multiple" permite seleção de múltiplas linhas;
  • "--editable" permite alterações no texto;
  • "--print-column=NÚMERO" apresenta uma coluna específica, o padrão é "1" e "ALL" pode ser usado para apresentar todas as colunas;
  • "--hide-column=NÚMERO" esconde uma coluna específica.

Opções pertinentes ao diálogo "--progress", que exibe uma barra de progresso de uma determinada tarefa:
  • "--text=TEXTO" define o texto do diálogo;
  • "--percentage=PORCENTAGEM" define porcentagem inicial;
  • "--pulsate" pulsa a barra de progresso;
  • "--auto-close" fecha o diálogo quando atingir 100%;
  • "--auto-kill" mata o processo principal se a tecla cancelar for pressionada.

As opções a seguir são referentes ao diálogo "--question", que é semelhante ao "--yesno" do "kdialog":
  • "--text=TEXTO" define o texto do diálogo;
  • "--no-wrap" não habilita quebra de linha no texto.

As opções seguintes referem-se ao diálogo de alerta que é dado por "--warning":
  • "--text=TEXTO" defini o texto do diálogo;
  • "--no-wrap" não habilita quebra de linha no texto.

As opções a seguir referem-se ao diálogo "--text-info" que mostra um texto:
  • "--filename=NOMEDOARQUIVO" abre o arquivo;
  • "--editable" permite alterações no texto.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Exemplos
   3. Dialog
   4. Kdialog
   5. Zenity
   6. Considerações finais
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Introdução ao Fortran (parte 1)

Variáveis, if, else e unless em Ruby

AWK - Manipulação de arquivos de texto

Monitoramento automático de logs e alertas por e-mail - Fácil e explicado

Simples e rápido: matando todos os processos de um usuário

  
Comentários
[1] Comentário enviado por edempoa em 27/10/2007 - 13:42h

Olá, o que é que a exclamação significa no #!/bin/sh?

[2] Comentário enviado por nunesvictor em 27/10/2007 - 15:16h

o shell tem uma variável de ambiente $HOME, não é necessário usar /home/$USER
assim o comando seria:
$ mkdir -p "$HOME/Ola mundo"

/home/$USER não funcionaria com o root, pq seu diretório é /root e não /home/root, pelo menos no slackware

:p

abrass e parabéns!

[3] Comentário enviado por SMarcell em 27/10/2007 - 15:42h

-----------------------------------------------------------------
edempoa

Olá, o que é que a exclamação significa no #!/bin/sh?

-----------------------------------------------------------------

Comentários em shell script geralmente são declarados utilizando o caractere '#'. No caso da exclamação, ela é usada como uma negação, ou seja, para informar que aquilo não é um comentário, e sim qual interpretador ele deverá utilizar.

[4] Comentário enviado por lazaro91 em 27/10/2007 - 15:44h

cara no segundo exemplo o caminho especificada cria o diretorio dentro do diretorio onde o shell foi escrito. Essa é a intensão ou não?
Obrigado

[5] Comentário enviado por elgio em 27/10/2007 - 17:28h

if [ $caminho = $caminho ]

Isto nunca será falso!
Quando o conteúdo da variável caminho não será igual ao conteúdo da mesma variável caminho?

Ainda deve-se ter MUITO cuidado ao fazer esta comparação. No exemplo abaixo:

caminho="temp"
if [ $caminho = $texto ]

Se a variável texto NÃO EXISTIR, haverá um erro de sintaxe, pois o que será expandido será if [ temp = ]

Problemas ao comparar variáveis SEM CONTEUDO.

Eu costumo contornar este problema com:

caminho="temp"
if [ "X$caminho" = "X$texto" ]

O X esta ai so para não deixar nenhum dos braços serem VAZIOS.

Outro CUIDADO é que isto é APENAS PARA STRINGS!!
Veja o efeito estranho disto:

A=45
B=123
if [ $A > $B ]
then
echo $A MAIOR que $B
else
echo $A NAO EH MAIOR que $B
fi

(pode executar). Porque ele achou que 45 é MAIOR que 123?

Porque ele analizou como string, ou seja, o '4' do 45 é maior que o '1' do 123. MUITO CUIDADO.

Agora se usar -gt ai sim tem-se o efeito desejado:

if [ $A -gt $B ]
then
echo $A MAIOR que $B
else
echo $A NAO EH MAIOR que $B
fi

Comentei sobre isto porque tu sugere no artigo que = é o mesmo que -eq e não é bem asssim:

A=0045
B=045
if [ $A = $B ]; then echo IGUAIS; else echo DIFERENTES; fi
# Vai imprimir DIFERENTES!!

if [ $A -eq $B ]; then echo IGUAIS; else echo DIFERENTES; fi
# Vai imprimir IGUAIS

Bom, parabéns pela coragem de escrever um artigo sobre um assunto que tem muitos pormenores. Como você disse, estudou muito. Sempre se estuda muito! E nunca se pára! :-D



[6] Comentário enviado por DaniloM em 27/10/2007 - 19:50h

Galera comecei a estudar shell script ontem e tenho um problema. Seguindo um exemplo do tutorial fiz isso:

#!/bin/sh
cd $HOME/Área de Trabalho
mkdir profile
cd profile
dialog --inputbox "Digite o caminho de onde você deseja criar o diretório." 10 60 2> $HOME/Área de Trabalho/profile/caminho.tmp

caminho=`cat $HOME/Área de Trabalho/profile/caminho.tmp`

dialog --inputbox "Digite o nome do diretório que deseja criar." 10 50 2> $HOME/Área de Trabalho/profile/diretorio.tmp

diretorio=`cat $HOME/Área de Trabalho/profile/diretorio.tmp`

if [ -e $caminho ]; then
mkdir -p "$caminho/$diretorio"
dialog --msgbox "O diretório $diretorio foi criado." 5 60
else
dialog --msgbox "Entre com um diretório válido." 5 60
fi

Era para criar uma pasta na Área de Trabalho(Desktop do ubuntu 7.10) e os arquivos que capturam o que eu escrevi ficarem dentro. Mas isso não acontece. Apenas aparece a janela dizendo para eu por um endereço de diretorio válido! Alguém pode me ajudar?

[7] Comentário enviado por elgio em 27/10/2007 - 19:58h

teu problema é com os espacos em branco em nome de arquivo (pra que por espaco em branco!!!???) e também pode ser por causa dos acentos (pra que por acentos???)

Quando for usar arquivo/dir com espaço ou tu coloca entre aspas ou faz um escape do espaco:

cd "$HOME/Área de Trabalho"

ou
cd $HOME/Área\ de\ Trabalho

Corriga isto em TODOS os locais do script onde aparece nome com espaço.

[8] Comentário enviado por DaniloM em 27/10/2007 - 20:30h

Olá elgio, meu problema ainda perciste. Uso acentos e espaços porque o ubuntu vei assim. Agora meu código está assim:

#!/bin/sh
cd $HOME/"Área de Trabalho"
mkdir profile
cd profile
dialog --inputbox "Digite o caminho de onde você deseja criar o diretório." 10 60 2> $HOME/"Área de Trabalho"/profile/caminho.tmp

caminho=`cat $HOME/"Área de Trabalho"/profile/caminho.tmp`

dialog --inputbox "Digite o nome do diretório que deseja criar." 10 50 2> $HOME/"Área de Trabalho"/profile/diretorio.tmp

diretorio=`cat $HOME/"Área de Trabalho"/profile/diretorio.tmp`

if [ -e $caminho ]; then
mkdir -p "$caminho/$diretorio"
dialog --msgbox "O diretório $diretorio foi criado." 5 60
else
dialog --msgbox "Entre com um diretório válido." 5 60
fi
E o problema continua quase o mesmo, agora aparece uma janela escrita que a pasta foi criada com sucesso apenas. O que está errado?

E o kdialog também não funcionou aqui. Deu um monte de erro. Será que é porque uso Gnome?

[9] Comentário enviado por lemuelroberto em 28/10/2007 - 00:04h

Olá Danilo,

Especifique os erros que ocorrem com o kdialog.


[10] Comentário enviado por removido em 28/10/2007 - 12:43h

tsc...tsc...

[11] Comentário enviado por SMarcell em 29/10/2007 - 08:31h

Danilo tente assim:

dialog --stdout --inputbox ...

[12] Comentário enviado por lestatwa em 29/10/2007 - 08:51h

excelente artigo!

mto bem explicado, com exemplos o q eh mto importate xD
parabens!

[13] Comentário enviado por lestatwa em 29/10/2007 - 08:56h

DaniloM..
teu problema tah ai
cd $HOME/"Área de Trabalho"
as aspas tem q vir antes do $
ficando assim cd "$HOME/Área de Trabalho"

xD

[14] Comentário enviado por luan tavares em 29/10/2007 - 12:55h

Shell Script e uma boa escolha pra quem gosta de Linux e quer começar a programar.

[15] Comentário enviado por lemuelroberto em 29/10/2007 - 20:00h

Ai galera vamos comentar...postem suas dúvidas. Eu respondi a todas por e-mail...

Muito obrigado a todos

[16] Comentário enviado por GilsonDeElt em 27/04/2008 - 21:44h

kolé!

DaniloM, num sei se cê ainda tá com problema, mas se estiver, tente "Desktop" no lugar de "Área de Trabalho" (pelo menos, no KDE do meu Slack é "Desktop").

Lemuel, seu artigo tá d+, cara! =D
Muito bom mesmo, com teoria e prática, ótima introdução ao assunto!

elgio, valeu pelos "complementos" que você postou.
Eu não sabia que "strings" não são tratadas como "números" nos exemplos mostrados...

Fuçando no VOL e na net, achei o site do Aurélio, muito bom pra quem mexe ou vai começar a mexer com ShellScript: http://aurelio.net/shell/

Há alguns dias, lendo o pkgtools (que tô traduzindo, pois quero arrumar meu Slack todo em pt_BR), me veio a idéia de portar o pkgtools do Slack para um dialog gráfico, e começei a buscar material.
Depois de ler este artigo, já tenho uma base para começar meu projeto...
Daqui há alguns dias, terei meu pkgtools em KDialog!
Quando estiver pronto, eu posto aqui!
Ou talvez antes, quando precisar de ajuda...

E obrigado a todos!

[17] Comentário enviado por lemuelroberto em 27/04/2008 - 22:18h

Ôpa GilsonElt,

muito obrigado, fico muito feliz por você.

E amigo, vai nessa tua força, os scripts dão uma grande liberdade sem precisar de um extenso estudo com em linguagens complexas.
Estou esperando ansioso pela sua portação para kdialog dos pkgtools.

Um abraço e até mais e me avise quando estiver pronto.

[18] Comentário enviado por marcelogomes3 em 17/07/2008 - 09:55h

agradeço pelas referencias

marcelo gomes eu suso Ubuntu

[19] Comentário enviado por rafael_novello em 21/07/2008 - 09:47h

Olá...

Com base no seu tutorial, tentei criar um script para login do sshfs de forma que o usuário execute-o e digite seu nome em qq máquina da empresa e consiga ter acesso ao servidor. Atualmente tenho um script para cada usuário :-(

Meu problema esta no momento de ler o arquivo temporário. Ele não pega o conteúdo da variável, pega o caminho do arquivo temporário.

Sou iniciante e esse erro deve ser simples mas não consigo resolver.

Abaixo vai o script:

#!/bin/bash
zenity --title="Montando diretorios" --entry --text="Digite o nome do usuario." > /tmp/user.tmp
user='cat /tmp/user.tmp'
if [ $? != 1 ]; then
sshfs $user@10.0.1.10:/home/arquivos ~/Desktop/Servidor
exit 0
fi

[20] Comentário enviado por lemuelroberto em 21/07/2008 - 12:25h

Olá rafael_novello,

Eu testei aqui, e se o script que você estiver usando for idêntico ao seu post, o problema é que você não definiu o que você realmente quer que a variável faça.

Você escreveu: user='cat /tmp/user.tmp'
Erro: você colocou aspas simples (').

O certo: user=`cat /tmp/user.tmp`
O porque: ao invés de aspas simples você deve usar crase (`)

Qualquer dúvida poste aqui.

[21] Comentário enviado por rafael_novello em 22/07/2008 - 08:30h

Olá lemuelroberto...

Obrigado pela dica. Agora ele funciona perfeitamente.
Minha inexperiência ainda vai contribuir muito para esse tipo de deslize.

Obrigado e parabéns pelo ótimo artigo.

[22] Comentário enviado por lemuelroberto em 24/07/2008 - 09:13h

rafael_novello,

Muito obrigado.
Continue lendo, buscando aprofundar que seus scripts vão sair bem mais tranquilos.

Abraço, qualquer coisa é só mandar um email ou um post aqui no VOL.

[23] Comentário enviado por klebervirgilio em 22/01/2009 - 21:59h

Mto bom o artigo!

Só estou com um problema...
root@chezmobile:/media/STORE/Documents/Linux# ./teste.sh
bash: ./teste.sh: /bin/bash: bad interpreter: Permission denied

Mesmo com o usuário root, qnd tento executar um script q eu criei.... dá erro de Permissão... estranho!!!!

alguém sabe oq é?

[24] Comentário enviado por lemuelroberto em 23/01/2009 - 16:06h

Olá Klebervirgilio,

o problema eh que seu script não tem premissão de execução> Para que você de permissão e possa roda-lo com o comando ./seu_script.sh, será necessário você entrar no diretorio onde o script está e digitar: chmod +x seu_script.sh

Caso não queira dar permissão, você pode roda-lo da seguinte maneira:

sh seu_script.sh

Qualquer dúvida é só mandar.

[25] Comentário enviado por write em 30/08/2009 - 01:53h

Fiz igual está lá em cima só que quando chega nessa parte: "Digite o caminho de onde você deseja criar o diretório." que eu digito o nome do diretório que dou enter ele diz: Diretório criado. e pronto acho que tem algo de errado que. Alguém pode me ajudar?

[26] Comentário enviado por AyrtonGomes em 09/03/2012 - 19:37h

Ótimo artigo, muito obrigado me ajudou bastante!.

[27] Comentário enviado por hmljunior1010 em 20/11/2017 - 12:58h


[3] Comentário enviado por SMarcell em 27/10/2007 - 15:42h

-----------------------------------------------------------------
edempoa

Olá, o que é que a exclamação significa no #!/bin/sh?

-----------------------------------------------------------------

Comentários em shell script geralmente são declarados utilizando o caractere '#'. No caso da exclamação, ela é usada como uma negação, ou seja, para informar que aquilo não é um comentário, e sim qual interpretador ele deverá utilizar.


No caso isto é um hashbang. Basicamente está linha indica que este aquivo será executado usando shell, poderia ser o bash.
Apesar de não ser uma fonte confiável da uma lida neste artigo da wikipedia:
https://en.wikipedia.org/wiki/Shebang_(Unix), você irá entender melhor.,


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts