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.
Nesta parte iremos estudar a teoria aplicada e é altamente recomendável você não copie e cole os exemplos, é bom que você vá digitando para ir se familiarizando com os comandos.
1º exemplo) Vamos começar com um script bem simples:
#!/bin/sh
mkdir -p "/home/$USER/Olá mundo"
Entendendo o que você escreveu:
mkdir -p : cria diretório se não existir;
/home/$USER/ : caminho;
$USER : é o usuário que está executando o script;
Olá mundo : o nome do diretório que você quer criar.
OBS: Note que "/home/$USER/Olá mundo" está entre aspas, isso é por que o diretório que você irá criar contém espaço. Se não houvesse espaço não seria necessário o uso das aspas.
2º exemplo) Vamos implementar o primeiro exemplo:
#!/bin/sh
echo "Digite o caminho de onde você deseja criar o diretório."
read caminho
echo "Digite o nome do diretório que deseja criar."
read diretorio
mkdir -p "$caminho/$diretorio"
Entendendo o que você escreveu:
echo : esse comando faz com que o shell imprima uma mensagem na tela;
read : faz com que o shell dê uma pausa e espere que algo seja digitado e depois capture e coloque o que foi digitado numa variável. A frente do "read" você pode notar que tem um nome, esse nome se tornará uma variável que mais tarde será acompanhada do "$" para indicá-la ao shell;
* o mkdir é acompanhado de "$caminho/$diretorio". Isso quer dizer que o shell executará mkdir seguido do caminho e do nome do novo diretório, é o que fizemos no 1º exemplo (mkdir "/home/$USER/Olá mundo"), só que quem escolhe onde irá ser criado e o nome do diretório criado é o usuário.
3º exemplo) Implementando os exemplos anteriores com condições
#!/bin/sh
echo "Digite o caminho de onde você deseja criar o diretório."
read caminho
echo "Digite o nome do diretório que deseja criar."
read diretorio
if [ $caminho = $caminho ]; then
mkdir -p "$caminho/$diretorio"
echo "O diretório $diretorio foi criado."
else
echo "Entre com um diretório válido."
fi
Entendendo o que você escreveu:
if(se) : testa uma ou mais expressões. Nesse exemplo (sem muita criatividade :-)) ele irá comparar a variável "caminho" se é igual a variável "caminho". O if deverá comparar deve estar entre colchetes "[ ]".
then(então) : após comparar as variáveis e for verdade, ele executará os comandos que você escrever;
else(senão) : após comparar as variáveis e não for verdade, ele executará os comando que você escrever;
fi: depois de terminar, a comparação deverá ser fechada pelo inverso de "if", que é "fi".
Além do "if" que testa uma ou mais expressões, temos:
"case", que testa várias expressões ao mesmo tempo (será explicado posteriormente);
"for", que testa uma ou mais expressões e substitui uma variável por um valor e executa os comandos pedidos;
"while", que testa continuamente uma expressão, até que ela se torne falsa.
** Todos esse controles de fluxo são fechados com seus respectivos espelhos, ou seja, o "if" é fechado com "fi" o "case" é fechado por "esac" e assim sucessivamente.
Além do "=" ou "-eq" que propõe, que duas expressões sejam iguais, temos:
"!=" que propõe, que duas expressões sejam diferentes;
">" ou "-gt" que propõe, que uma expressão seja maior que outra;
">=" que propõe, que uma expressão seja maior ou igual a outra;
"<" ou "-lt" que propõe, que uma expressão seja menor que outra;
"<=" que propõe, que uma expressão seja menor ou igual a outra;
"-d" que propõe, que a expressão seja um diretório;
"-e" que propõe, que se existe a expressão;
"-z" que propõe, que a expressão esteja vazia;
"-f" que propõe, que a expressão contenha texto;
"-o" que propõe, que se usuário for o dono da expressão;
"-r" que propõe, que se o arquivo pode ser lido;
"-w" que propõe, que se o arquivo pode ser alterado;
"-x" que propõe, que se o arquivo pode ser executado.
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.
[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?
[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...
[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.
[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.
[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:
[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?
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.,