InterRedes
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.



 
InícioÚltimas imagensRegistrarEntrar

 

 Programando em shell script

Ir para baixo 
AutorMensagem
P@P
Participativo
Participativo



Número de Mensagens : 104
Idade : 66
Data de inscrição : 27/01/2009

Descrição
Sistema Operativo: 3

Programando em shell script Empty
MensagemAssunto: Programando em shell script   Programando em shell script Icon_minitimeQua Fev 04, 2009 8:20 pm

Programando em Shell Script


1- Introdução

Quem usa Linux conhece bem o prompt de comando sh, ou variações como bash. O que muita gente não conhece é que o sh ou bash tem uma “poderosa” linguagem de script embutido nelas. Várias pessoas utilizam esta linguagem para executar varias tarefas administrativas no Linux, ou ate mesmo criar seus próprios programas. O criador da distribuição Slackware, Patrick Volkerding utiliza esta linguagem para toda a instalação e configuração da sua distribuição. Podemos criar scripts para fazer as tarefas diárias de um servidor, para efectuar backup automático, criar textos, vários tipos de formatação e muito mais. Para vermos como esta linguagem pode ser útil, vamos ver alguns passos introdutórios sobre ela.

Os interpretadores de comandos são programas utilizados como intermediário entre os utilizadores e o sistema. Através destes interpretadores, o utilizador digita um comando e o interpretador executa no sistema. Eles são a Shell do sistema Linux. Vamos utilizar o interpretador de comandos bash, por ser muito mais extenso que o sh, e para que haja uma melhor compreensão das informações obtidas, e bom ter uma base sobre o conceito de lógica de programação.

Uma das vantagens destes shell scripts é qe eles não precisam ser compilados, ou seja, bast apenas criar um arquivo de texto qualquer, e inserir os comandos no TXT. Para darmos a definição a este arquivo de “shell script”, temos que incluir uma linha de comando no inicio do arquivo assim (#!/Bin/bash) e trorna-lo executável usando o comando chmod. Vamos seguir com um pequeno exemplo de um shell script que mostre na tela : “InterRedes 2009!” ;

Código:
#!/Bin/bash
Echo ‘InterRedes 2009!’


Descrevendo o script acima a primeira linha indica que todas as linhas a seguir devem ser executadas pelo bash (localizado em /Bin/bash), na segunda linha mostra no monitor “InterRedes 2009” utilizando o comando echo. Como se pode ver, todos os comandos utilizados na linha de comandos podem ser incluídos no shell script, criando uma serie de comandos, e a essa serie de comandos chamamos de shell script. Vamos tentar também dar o comando “file arquivo” e vemos que a definição dele é de Bourne - Again Shell Script (Bash Script).
Contudo, para o arquivo poder ser executável, temos de atribuir o comando de executável. E como vimos antes o comando chmod encarrega-se disso:
Código:

$ chmod +x arquivo

E pronto o arquivo pode ser executável com um simples “./arquivo”.


Conceitos de Variáveis em shell script

Variáveis são caracteres que armazenam dados, tipo um atalho. O bash reconhece uma variável quando ela começa com $, ou seja, a diferença entre ‘palavra’ e ‘$palavra’ é que a primeira e uma palavra qualquer e a outra é uma variável. Para defenirmos uma variável usamos a seguinte sintaxe:

Código:
Variável=”valor”

O “valor” será atribuído a “variável”. O valor pode ser números, frases, comandos ou ate outras variáveis. O valor pode ser expressado entre as aspas (“”), apóstrofos(‘’) ou crases (``). As aspas vão interpretar as variáveis que estiverem dentro do valor, os apóstrofos vão ler o valor literalmente, sem interpetar nda, e as crases vão interpetar um comando e retornar a sua saída para a variável. Vamos ver ums exemplos:

Código:
$ variável=”Eu fiz login como utilizador $user”
$ echo $variavel
      Eufiz login como utilizador InterRedes
$ variável=’ Eu fiz login como utilizador $user’
$ echo $variavel

    Eu fiz login como utilizador $user’

$ variável=”O meu directório actual é o ‘pwd’”
$ echo $variavel

    O meu diretorio actual é o /home/interredes

Se quisermos criar u script em que o utilizador deve interagir com ele, é possível que você queira que o próprio utilizador defina uma variável, e para isso usamos o comando read, que dará uma pausa no script e fica a espera que o utilizador digite algum valor e prima enter.
Exemplo:

Código:
Echo “Entre com o valor para a variável: “ ; read variável
(O utilizador digita a tecla enter, vamos supor que ele digitou ‘eu sou admin’)
Echo $variavel
      Eu sou admin

Controlo de fluxo com o if

Controlo de fluxo são comandos que vão testando algumas alternativas, e de acordo com essas alternativas, vão executando comandos. Um dos comandos de controlo de fluxo mais usados e o if, que e baseado na lógica “ se acontecer isto, irei fazer isto, se não vou fazer aquilo”.
Exemplo:

Código:
If [ -e $linux ]
then
    echo ‘A variável $linux existe. ‘
else
    echo ‘A variável $linux não existe.’
fi

O que faz este pedaço de código?

O if testa a seguinte expressão: Se a variável $linux existir, então (then) ele diz que existe com echo, se não (else), ele diz que não existe. O operador –e que usamos é pré-defenido e podemos wncontrar a lista dos operadores na seguinte tabela:


Pop 20






Outras Alternativas


Existem inúmeros comandos no Linux, e para explicar todos tínhamos de criar um Livro. Mas existem outras possibilidades de aprendizado desta língua, que também é usado em todas as programações. Primeiro de tudo temos de poder ver o manpage do bash (comando man bash), que disponibilizara os comandos embutidos no interpretador de comandos. Uma das coisas essenciais para aprender é arranjar outros scripts e ir estudando e comparando entre eles. Procuramos sempre comandos e expressões novas em outros scripts e em manpages dos comandos. E por ultimo praticar bastante. ;-)
Na seguinte tabela, podemos encontrar uma lista de comandos para serem utilizados numa shell script:






Código:
Criando os nossos próprios scripts facilitamos parte da nossa vida no Linux!!!

2. Aprofundando mais um bocado!!!

Já falamos sobre o conceito de programação em shell script, e demos o primeiro passo para construir os nossos scripts. Agora vamos aprofundar darmo-nos nos comandos mais complicados, aprendendo a fazer programas mais úteis. Nestes comandos estão incluídos o case, for, while e until. Além disso vamos falar de funções e, por ultimo temos um programa shell script.

Case

O case é para controlo de fluxo, tl como o if. Mas enquanto o if testa expressos não exatas, o case vai agir de acordo com os resultados exatos.
Exemplo:

Código:
Case $1 in
    Parametro1) comando1 ; comando2 ;;
  Parametro2) comando3 ; comando4 ;;
    *) echo “Você tem de entrar com um parâmetro valido” ;;
Esac

Aqui aconteceu o seguinte: o case leu a variavel $1 (que é o primeiro parâmetro passado para o programa), e comparou com valores extaos. Se a variavel $1 for igual à “parametro1”, então o programa executará o comando 1 e o comando2; se for igual à “parametro2”, executara o comando3 e o comando4, e assim em diante. A ultima opção (*), é uma opção padao do case, ou seja, se o parâmetro passado não for igual a nenhuma das outras opções anteriores, esse comando será executado automaticamente.

Você pode ver que, com o case fica muito mais fácil criar um “menu” para o shell script do que com o if. Vamos demontrar a mesma função anterior, mas agora usando o if:

Código:
If [ -z $1 ] ; then
    echo “Você tem de entrar com um parâmetro válido”
    exit
elif [ $1 = “parametro1” ] ; then
    comando1
    comando2
elif [ $1 = “parametro2” ] ; then
    comando3
    comando4
else
    echo “Voce tem de enter com um parâmetro valido”
fi


MrTcp


Incopleto falta acabar as tabelas....


Última edição por MrTcp em Qua Fev 04, 2009 8:22 pm, editado 1 vez(es)
Ir para o topo Ir para baixo
http://InterRedes.pt.la/
P@P
Participativo
Participativo



Número de Mensagens : 104
Idade : 66
Data de inscrição : 27/01/2009

Descrição
Sistema Operativo: 3

Programando em shell script Empty
MensagemAssunto: Re: Programando em shell script   Programando em shell script Icon_minitimeQua Fev 04, 2009 8:21 pm

Vejamos a diferença, é muito mais pratico usar o case! A vantagem do if é que ele pode testar varias expressões que o case não pode. O case é mais pratico, mas o if pode substitui-lo e ainda abrange mais funções. Repar que no exemplo com o if, falamos em um comando novo: o elif- que é uma combinação de else e if. Ao contrario de fechar o if para criar outro, usamos o elif para testar uma expressão no mesmo comando if.

for

O laço for vai substituindo uma variavel por um valor, e vai executando os comandos pedidos.
Exemplo:

Código:
for i in *
do
  cp $i.backup
  mv $i.backup /usr/backup
done

Primeiro o laço for atribuiu o valor de retorno do commando “*” (que é equivalente a um ls sem nenhum parâmetro) para avariavel $i, depois executou o bloco de comandos. Em seguida ele tribui outro valor do comando “*” para a variavel $1 e reexecutou os comandos. Isso se repete ate que não sobrem valores de retorno do comando “*”.
Exemplo:

Código:
for original in *; do
    resultado=`echo $original1 |
                        tr ‘ [:upper:] ‘ ‘ [:lower:]’`
    If [ ! –e $resultado ] ; then
        mv $original $resultado
    fi
done

O que ocorre aqui e a tranformaçao de letras maisculas para minusculas. Para cada arquivo que o laço lê, uma variavel chamada $resultado ira conter o arquivo em letras minúsculas. Para transformar em letras minúsculas usamos o comando tr. Caso não exista um arquivo igual e com letras minúsculas, o arquivo é renomeado para o valor da variavel $resultado, de mesmo nome, mas com letras minúsculas.
Como mostram os exemplos, o laço for pode ser bem útil no tratamento de múltiplos arquivos. Nos podemos deixa-los todos com letras minúsculas sem precisar renomear cada um manualmente, podemos organizar dados, fazer backup, entre outas coisas.

Código:
While

O while testa continuamente uma expressão, ate que ela se torne falsa.
Exemplo:

Código:
Variavel=”valor”
While [ $variavel = “valor” ] ; do
      Comando1
      Comando2
done

O que aconteceu aqui foi o seguinte: enquanto a “$variável” for igual a “valor”, o while ficara executando os comandos 1 e 2, ate que a “$variavel” não seja mais igual ao “valor”. Se no bloco de comandos a “$variavel” mudasse, o while iria para de executar os comandos quando chegasse em don, pois agora a expressão $variavel=valor não era mais verdade.

Until

O until tem as mesmas características do while, a única diferença é que faz o contrario.
Exemplo:

Código:
Variavel=”naovalor”
Until [ $viavel = “valor” ] ; do
    Comando1
    Comando2
Done

Em vez de executar o bloco de comandos (comando1 e comando2) ate que a expressão se torne falsa, o until testa a expressão e executa o bloco de comandos ate que a expressão se torne verdadeira. No exemplo, o bloco de comandos será executado desde que a expressão $variavel=valor não seja verdadeira. Se no bloco de comandos a variável for definida como “valor”, o until para de executar os comandos quando chega o done.
Exemplo para o until que, sintacticamente invertido, serve para o while também:

Código:
Var=1
Count=0
Until [ $var = “0” ] ; do
    Comando1
    Comando2
    If [ $count = 9 ] ; then
            Var=0
    Fi
    Count=`expr $count + 1`
Done

Primeiro atribuímos à variável “$var” o valor “1”. A variável “$count” será uma contagem para quantas vezes quisermos executar o bloco de comandos. O until executa os comandos 1 e 2, enquanto a variável “$var” for igual a “0”. Então usamos um if para atribuir o valor 0 para a variável “$var”, se a variável “$count” for igual a 9. Se a variável “$count” não for igual a 0, soma-se 1 a ela. Isso cria um laço que executa o comando 10 vezes, porque cada vez que o bloco de comandos e executado, soma-se 1 à variável “$count”, e quando chega em 9, a variável “$var” é igual a 0, quebrando assim o laço until.

Usar vários scripts num só


Pode-se precisar criar vários scripts shell um outro script externo para que este faça alguma função e não precisar reecrever o código todo? É simples, você so precisa incluir o seguinte comando no seu script shell:
. bashscript2
Isto executa o script shell “bashscript2” durante a execução do seu script shell. Neste caso ele será eecutado na mesma script shell em que esta sendo usado o comando. Para utilizar outra shell, voçe simplesmente substitui o “.” pelo executável da shell assim:

Código:
Sh script2
Tcsh script3

Com estas linhas o script2 sera executado com a shell sh, e o script3 com a shell tcsh.


Variáveis especiais



Tambem podemos encontrar muitas variáveis, já predefinidas, na pagina do manual bash ( comando”man bash”, secção Shell Variables).

Funçoes

Funçoes são blocos de comandos que podem ser definidos para uso posterior em qualquer parte do código. Praticamente todas as linguagem usam funções que ajudam a organizar o código. Vamos ver uma sintaxe de uma função:

Código:
Funcao ()  {
      Comando1
      Comando2
      …
}
A função funciona como um simples comando próprio. Podemos executar a função em qualquer lugar do script shell, e os comandos 1, 2 e outros vão ser executdos. A flexibilidade das funcoes permite facilitar a vida do programador, como no exemplo final.

Ultimo Exemplo


Vamos dar um exemplo de um programa que utileze o que falamos ate aqui.

Código:
#!/bin/bash
# Exemplo Final de Script Shell
Principal() {
echo "Exemplo Final sobre o uso de scripts shell"
echo "−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−"
echo "Opções:"
echo
echo "1. Trasformar nomes de arquivos"
echo "2. Adicionar um usuário no sistema"
echo "3. Deletar um usuário no sistema"
echo "4. Fazer backup dos arquivos do /etc"
echo "5. Sair do exemplo"
echo
echo −n "Qual a opção desejada? "
read opcao
case $opcao in
1) Transformar ;;
2) Adicionar ;;
3) Deletar ;;
4) Backup ;;
5) exit ;;
*) "Opção desconhecida." ; echo ; Principal ;;
esac
}
Transformar() {
echo −n "Para Maiúsculo ou minúsculo? [M/m] "
read var
if [ $var = "M" ]; then
echo −n "Que diretório? "
read dir
for x in `/bin/ls` $dir; do
y=`echo $x | tr '[:lower:]' '[:upper:]'`
if [ ! −e $y ]; then
mv $x $y
fi
done
elif [ $var = "m" ]; then
echo −n "Que diretório? "
read dir
for x in `/bin/ls` $dir; do
y=`echo $x | tr '[:upper:]' '[:lower:]'`
if [ ! −e $y ]; then
mv $x $y
fi
done
fi
}
Adicionar() {
clear
echo −n "Qual o nome do usuário a se adicionar? "
read nome
adduser nome
Principal
}
Deletar() {
clear
echo −n "Qual o nome do usuário a deletar? "
read nome
userdel nome
Principal
}
Backup() {
for x in `/bin/ls` /etc; do
cp −R /etc/$x /etc/$x.bck
mv /etc/$x.bck /usr/backup
done
}
Principal

MrTcp
Ir para o topo Ir para baixo
http://InterRedes.pt.la/
 
Programando em shell script
Ir para o topo 
Página 1 de 1

Permissões neste sub-fórumNão podes responder a tópicos
InterRedes :: Sistemas Operativos :: Linux/Unix-
Ir para: