Programando em shell script (conceitos básicos)

Estou montando este artigo para ajudar as pessoas que tem interesse em começar a programar em shell script. Não achei nenhuma uma introdução rápida e de fácil entendimento aqui no VOL.

[ Hits: 40.985 ]

Por: Marcello Bontempo Salgueiro em 21/12/2006 | Blog: http://marcello.tranqueira.net


Mão na massa!



Todo o programa deve começar com um interpretador de script. O programa inicia da seguinte maneira:

#!/bin/bash

Ou:

#!/bin/sh

OBS: O programa sempre começa com os caracteres '#!' na frente.

Vamos ver um exemplo então:

# nano bomdia.sh

Dentro do nano:

#!/bin/bash
clear
echo "Olá $USER"

Salve o programa e execute-o:

# sh bom.sh

Algumas condicionais possíveis:

= Igual
-eq Igual
!= Diferente
-gt Maior
-lt Menor
-o Ou
-d Se o arquivo for diretório
-e Se existir o arquivo
-z Se o arquivo estiver vazio
-f Se o arquivo conter algum texto
-o Se o usuário for o dono do arquivo
-r Se o arquivo pode ser lido
-w Se o arquivo pode ser alterado
-x Se o arquivo pode ser executado


Se Senão

O 'se' 'senão' do bash é parecido com o das outras linguagens de programação:

if=se
fi=fim se
else=senão

Porém o "if" no shell script não faz um teste com uma condição e sim com um comando. O atalho para o teste pode ser utilizado com o símbolo [ ], veja o exemplo:

if [ $? = 0 ]; then
   echo 'Olá'
else
   echo 'Alô'
fi

OBS: Observe que deve haver espaços entre o comando e as chaves.

Condicional case

O "case" também serve para o controle de fluxo, mas permite que uma série de valores e expressões regulares seja testada e os comandos executados. A sintaxe:

case variável in
    expressão1) comando1 ; comando2 ; ;
    expressão2) comando3 ; comando4 ; ;  
    *) comando5 ; ;
esac

OBS: O "*)" é um padrão do case, se a variável testada não for igual a nenhuma das expressões 1 e 2, ele vai executar o comando5.

O loop for

A sintaxe do "for" é um pouco complicada de se entender, por isso aconselho fazer esses dois exemplos para poder distinguir.

Crie um arquivo txt, vamos escrever algo nele:

$ ls -1 > lista.txt
$ for i in 'cat lista.txt' ; do cp $i.backup; mv $i.backup /usr/backup; done;


A $i é atribuída para cada linha do arquivo.

Outro exemplo:

for numero in um dois tres quatro cinco
do
   echo "Contando: $numero"
done

O while

É usada como nas outras linguagens, enquanto verdadeiro ou falso continua a executar a condição (no nosso caso o comando). Ex.:

variavel='valor'
while [ $variavel = "valor" ]; do
  comando1
  comando2
done

veja um exemplo de uma grande programação shell:

# cat /etc/profile

E fim.

Página anterior    

Páginas do artigo
   1. Variáveis
   2. Aliases
   3. Mão na massa!
Outros artigos deste autor

Instalação e configuração do Hylafax (servidor de FAX)

Aircrack-ng e sua família para quebrar WEP e WPA1

Escreva poemas com a sua linguagem de programação

Criando um Ubuntu (6.10/7.04) personalizado

Leitura recomendada

Como matar um processo - kill, killall, pkill e xkill

AWK - Manipulação de arquivos de texto

Debugando shell scripts

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

Mostrando dicas ao iniciar o terminal

  
Comentários
[1] Comentário enviado por tuxSoares em 21/12/2006 - 09:37h

Muito fraco, ja existem inumeros artigos desse tipo, acho que foi feito somente para ganhar pontos no rancking.
Mas ta valendo a iniciativa

[2] Comentário enviado por pacman em 21/12/2006 - 09:41h

Bom, é bem resumido, uma coisa interessante de se falar na parte de aliases é que vc pode criar um alias com o mesmo nome de um comando.

alias ls='ls -la'

nesse caso, se vc quiser chamar o comando original e não o alias, vc usa uma contra barra na frente do alias ;-)

[3] Comentário enviado por thelinux em 21/12/2006 - 13:33h

Parabéns pelo artigo. Para quem está inciando no mundo Linux, um artigo como este ajuda bastante. Existem, milhares de documentações sobre Linux e está aqui é mais uma e que ajuda.

Que venha o próximo artigo.

[4] Comentário enviado por tenchi em 22/12/2006 - 00:17h

Também é possível utilizar aritmética nas condicionais:
if ((a>0)) && ((a<=10))
then
echo "A é maior que zero e menor ou igual que 10"
fi
# e também tem o elif...

E no for:
for ((var=1;var<10;var++))
do
echo $var
done

Olha kra, eu comecei a mexer em shell esses tempos, e acho que para um iniciante, ler esse artigo confunde um pouco...
Não estou criticando o seu trabalho, deixo claro aqui, blz?

Falow

[5] Comentário enviado por removido em 22/12/2006 - 08:24h

a linha #!/bin/bash não é necessáriamente obrigatoria, ela somente indica o caminho do interpretador, sem esta linha no seu script, você poderia executalo, chamando o bash com o caminho do script.

O for seta a variavel com cada valor dado separado por espaços, caso o programador queira toda a frase, deve usar ex:

ls -la | while read x;do
echo $x
done

Bom são essas minha observação, no demais esta de bom tamanho para iniciantes.

[6] Comentário enviado por mbsalgueiro em 22/12/2006 - 15:05h

obrigado pela criticas e comentarios aqui! pois somente elogios não se cresce!!!!
tenchi é um pouco complicado para iniciante tb concordo mas tentei fazer de uma forma mais resumida para os iniciante, paraque eles tenham um ponta pé para a inspiração para comecar a programar em shell!! E quem sabe ate ajudar a crescer o SL!!
E continuem postando aqui comentarios crescentes!!!! Sempre são bem vindos...!!! Como sempre digo...: "Quanto mais penso que sei, mais eu percebo que não sei nda!!"

[7] Comentário enviado por yetlinux em 23/12/2006 - 06:21h

Acho que faltou dizer prá que serve o "pipe", vulgo barra vertical "|". Mas isso é para informar quem não sabe. Há outras coisas assim também.

Para primeiro artigo está ótimo, há aqui muitas boas idéias.
O próximo artigo que você escrever sairá ainda melhor, não se preocupe.

[8] Comentário enviado por celsopimentel em 24/12/2006 - 16:28h

Ola! Amigos, gostaria de uma mão para realizar o seguinte script.

tenho um arquivo chamado download.php, no interior dele têm uma data por ex. 24-12-06. quero fazer um script que edite o arquivo download.php e altere a data para um dia após o atual. por ex. se hoje for dia 20-12-06 ele tem que editar o arquivo e colocar a data de dia 21-12-06. Isso é possível????

[9] Comentário enviado por tenchi em 24/12/2006 - 20:03h

celsopimentel, acho que se você pesquisar alguma coisa sobre os comandos sed e tr, vc vai achar a solução deste problema.
Foi mal por não ser mais específico, pois eu também não sei como fazer.
Mas posta aqui se conseguir.

[10] Comentário enviado por celsopimentel em 25/12/2006 - 09:14h

Obrigado Tenchi, valeu! Vou pesquisar.

[11] Comentário enviado por tenchi em 26/12/2006 - 00:33h

Ah, uma coisa que eu não entendi..

Variávei em shell não são declaradas.
Declarar é algo que fazemos comumente em C, pascal, etc.
int j; //c
j:integer; {pascal}
E as variáveis só são tratadas como $var quando queremos o conteúdo delas. Quando atribuímos um valor à ela, usamos só o nome dela mesmo (var="um dois tres"). A menos, é claro, que você use ela em cálculos ((var+1)).
Ah, e acho que um jeito mais prático de verificar o conteúdo se uma variável é:
$ echo $var
Mas esse comando set eu não conhecia. Legal. Bem diferente do set do tcl (atribuição).

Só correções, não críticas. Continue assim.

Falow mais uma vez.

[12] Comentário enviado por jhoumedeiros em 26/12/2006 - 11:06h

Cara gostei... finalmente consegui entender o for... hauhau

Flw!!!

[13] Comentário enviado por mbsalgueiro em 26/12/2006 - 21:12h

Fico feliz jhoumedeiros!!!! =)
espero q continuem postando aqui!!!!!!!
vlw galera!!

[14] Comentário enviado por removido em 27/12/2006 - 12:12h

Parabens pelo artgo!
quanto aos condicionais
são semelhantes aos usados
na linguagem FORTRAN 77

[15] Comentário enviado por minduim em 08/04/2009 - 17:16h

Ola, você sabe como converter String para ineteger ou float em shell script?


Contribuir com comentário