Um pouco mais sobre Shell Script

Started by Anonymous, 30 de May , 2006, 05:14:43 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Anonymous

Olá galera, sei que muitos aqui estão enjuados ou coisa do tipo de tanto vêr sobre Shell script e záz.  ;D

Bem aqui peguei algumas informações em Home pages, Livros e algumas Revistas. Se virem alguma Home page com assunto semelhante ou relacionado porquê, foi copiado ou add de algum lugar vlw?

Let's Go!

= = = = == = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

Shell scripts

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

Estrutura geral de um script em BASH-Shel
l
Os arquivos de script permitem construir esquemas de execução complexos a
partir dos comandos básicos do shell. A forma mais elementar de arquivo de
script é apenas um conjunto de comandos em um arquivo texto, com permissões
de execução habilitadas. O arquivo backup, cujo conteúdo é mostrado a
seguir, é um exemplo de script:

echo "Iniciando backup..."

# montar o diretório do servidor de backup
mount backserver.ppgia.pucpr.br:/backup /backup

# efetuar o backup em um arquivo tar compactado
tar czf /backup/home.tar.gz /home

# desmontar o diretório do servidor de backup
umount /backup

echo "Backup concluido !"
Quando o script backup for executado, os comandos do arquivo serão
executados em seqüência pelo shell corrente (de onde ele foi lançado).
Assim, se o usuário estiver usando o shell bash, os comandos do script serão
executados por esse shell. Como isso poderia gerar problemas em scripts
usados por vários usuários, é possível forçar a execução do script com um
shell específico (ou outro programa que interprete os comandos do arquivo).
Para isso é necessário informar ao sistema operacional o programa a ser
usado, na primeira linha do arquivo do script:

#!/bin/bash --noprofile
# A opção --noprofile inibe a leitura dos arquivos de inicialização
# do shell, tornando o lançamento do script muito mais rápido.

# comandos de um script em Bash-Shell
server=backserver.ppgia.pucpr.br
backdir=/backup
...
exit 0
Com isso, será lançado um shell bash separado, somente para interpretar as
instruções do script. O shell será terminado pelo comando exit, cujo
parâmetro é devolvido ao shell inicial através da variável $?. Esse
procedimento pode ser usado para lançar scripts para outros shells, ou mesmo
outros programas, como perl, awk, sed, etc.


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

Parâmetros de entrada
Os argumentos da linha de comando são passados para o shell através da
variável local $argv. Os campos individuais dessa variável podem ser
acessados como em uma variável local qualquer. Além disso, uma série de
atalhos é definida para facilitar o acesso a esses parâmetros:

·         $0 : o nome do script

·         $n : o n-ésimo argumento

·         $* : todos os argumentos

·         $# : quantidade de argumentos

·         $? : status do último comando executado (0 = verdadeiro e 1 =  falso)

·         $$ : número de processo (PID) do shell que executa o script

Vejamos um exemplo através do script listaparams:

#!/bin/bash

# exemplo de uso dos parâmetros de entrada

echo "Nome do script : $0"

echo "Primeiro parâmetro : $1"

echo "Todos os parâmetros : $*"

echo "Numero de parametros : $#"

echo "Numero deste processo : $$"

exit 0

Chamando o script acima com alguns parâmetros obtemos a seguinte resposta:

ppgia:~> listaparams banana tomate pessego melao pera uva

Nome do script : listaparams

Primeiro parâmetro : banana

Todos os parâmetros : banana tomate pessego melao pera uva

Numero de parametros : 6

Numero deste processo : 2215

ppgia:~>


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

Controle de fluxo
Existem diversos construtores de controle de fluxo que podem ser usados em
scripts BASH-Shell. Os principais são:

·         if-then :

        if ( condição ) then
               ...
        fi
·         if-then-else:

        if ( condição ) then
               ...
        else
               ...
        fi
·         if-then-elif-else:

        if ( condição ) then
               ...
        elif
               ...
        else
               ...
        fi
·         for loop :

        for variável in lista de valores
        do
               ...
        done
·         while loop :

        while ( condição )
        do
               ...
        done
·         case :

        do case variável in
               string1)
                       ...
                       break;;
               string2)
                       ...
               break;;
               *):
                       ...
                       break;;
        esac
·         select :

        select variável in lista de valores
        do
               ...
        done
Além das estruturas acima, algumas outras podem ser usadas para executar
comandos em situações específicas:

·         `comando`: substitui a expressão entre crases pelo resultado
(stdout) da execução do comando. Por exemplo, a linha de comando abaixo
coloca na variável arqs os nomes de arquivos retornados pelo comando find:

arqs=`find /etc -iname ´???´`
·         comando1; comando2; comando3: executa seqüencialmente os comandos
indicados:

cp *.c /tmp ; rm *.txt ; ls -l
·         ( comando ) : executa o comando entre parênteses em um sub-shell
(lança um shell separado e passa o comando como parâmetro). Por exemplo:

( ls -l > stdout.txt ) 2> stderr.txt
O exemplo acima é bastante usado para separar as saídas stderr e stdout nos
shells da família bash.

Exemplo utilizando select e case.

      #!/bin/bash

      PS3="Please enter a number "

        select i in fo*

           do case $i in

              food|fool|foot)

                 echo "good choice"

                 break;;

              for|foxy)

                 echo 'poor choice'

                 echo 'Invalid number'

                 break;;

              *)

                 echo try again;;

           esac

        done

Exemplo testando o retorno de um comando.

      #!/bin/bash

      ls /etc/passwd >/dev/null 2>&1

      if [ $? ]

      then

            echo "Existe o arquivo"

      else

            echo "Arquivo nao existe!!!"

      fi


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

Operadores lógicos e aritméticos
Para implementar as estruturas de controle de fluxo é necessário definir
condições, que podem ser feitas através de testes. Podemos efetuar
comparações entre expressões (deve-se utilizar [ ] ou o comando test no if)
através dos seguintes operadores:

·         Comparações entre números:

-eq igual a
-ge maior ou igual
-gt maior que
-le menor ou igual
-lt menor que
-ne diferente (não igual)
·         Comparações entre strings:

== != < >
·         Conectivos lógicos (and, or):

-a -o
·         Operadores lógicos bit a bit:

! & | << >>
·         Operadores aritméticos:

+ - * / %
Para realizar uma operação matemática, é melhor utilizar a seguinte notação
var=$((var1 expressão var2))

Vejamos alguns exemplos de expressões usando os operadores acima definidos:

if [ "$LOGNAME" == "root" ]

then

...

fi



while test "$1" != ""

do

echo "Parâmetro $1"

shift

done



if [ $# -le 3 ]

then

echo "Número insuficiente de parâmetros de entrada"

fi

CONTADOR=1

while [ $CONTADOR -le 10 ]

do

echo "Número $CONTADOR"

CONTADOR=$((CONTADOR+2))

done



if [ `who | wc -l` -ge $maxusers ]

then

echo "Login negado, pois há mais de $maxusers usuários conectados."

logout

else

fi


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

Operadores de teste em arquivos e strings

Os operadores de teste em arquivos e strings permitem verificar propriedades
de entradas no sistema de arquivos. Eles são usados na forma "-op", onde op
corresponde ao teste desejado. Os principais testes são:

·         e : a entrada existe

·         r : a entrada pode ser lida

·         w : a entrada pode ser escrita

·         O : usuário é o proprietário da entrada

·         s : tem tamanho maior que zero

·         f : é um arquivo normal

·         d : é um diretório

·         L : é um link simbólico

·         b : é um dispositivo orientado a bloco

·         c : é um dispositivo orientado a caracatere

·         p : é um named pipe (fifo)

·         S : é um socket special file

·         u : tem o bit SUID habilitado

·         g : tem o bit SGID habilitado

·         G : grupo da entrada é o mesmo do proprietário

·         k : stick bit está habilitado

·         x : a entrada pode ser executada

·         z : a string  tem tamanho zero

·         n : a string  tem tamanho diferente de zero

·         nt: Verifica se um arquivo é mais novo que outro

·         ot: Verifica se um arquivo é mais velho que outro

·         ef: Verifica se é o mesmo arquivo (link)

  Vejamos um exemplo de uso desses operadores:

arquivo='/etc/passwd'

if [ -e $arquivo ]

then

if [ -f $arquivo ]

then

if [ -r $arquivo ]

then

source $arquivo

else

echo "Nao posso ler o arquivo $arquivo"

fi

else

echo "$arquivo não é um arquivo normal"

fi

else

echo "$arquivo não existe"

fi





#!/bin/bash

arq1=$0

arq2='/etc/passwd'

arq3='/etc/passwd'

if [ $arq1 -nt $arq2 ]

then

echo "Arquivo $arq1 eh mais novo que $arq2"

fi

if [ $arq1 -ot $arq2 ]

then

            echo "Arquivo $arq1 eh mais velho que $arq2"

fi

if [ $arq3 -ef $arq2 ]

then

echo "Trata-se do mesmo arquivo"

fi


As opções podem ser agrupadas em um único teste. Por exemplo, "-erf arquivo"
testa se o arquivo indicado existe, se é um arquivo normal e se pode ser
lido:

arquivo='/etc/passwd'

if [ -efr $arquivo ]

then

source $arquivo

else

echo "Problemas no acesso a $arquivo"

fi


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

Expansão de variáveis
Muitas vezes é necessário pegar apenas uma parte de uma variável. Neste
caso, é possível utilizar os caracteres de expansão de variáveis para pegar
partes de uma string. Alguns parâmetros de expansão são:

·         ${parâmetro#padrão}: Remove a menor parte a esquerda da parâmetro.

·         ${parâmetro##padrão}: Remove a maior parte a esquerda da
parâmetro.

·         ${parâmetro%padrão}: Remove a menor parte a direita da parâmetro.

·         ${parâmetro%%padrão}: Remove a maior parte a direita do parâmetro.

·         ${parâmetro//padrão/string}: Substitui o padrão pela nova string
do parâmetro.

·         ${parâmetro:início:tamanho}: Pega uma parte da variável.

Existe vários outros, consulte o comando bash (man bash) para maiores
detalhes.

Vejamos script de exemplo do uso desses modificadores:

#!/bin/bash

texto="/etc/passwd"

echo "Tirando o nome do arquivo = ${texto%passwd}"

echo "Tirando o caminho do arquivo = ${texto#/etc/}"

echo "Substituindo passwd por group = ${texto//passwd/group}"



#!/bin/bash

meses=( Janeiro, Fevereiro, Marco, Abril, Maio, Junho, Julho, Agosto,
Setembro, Outubro, Novembro, Dezembro )

echo

echo "Entre com Uma data no formato dd/mm/aaaa :"

read data

dia=${data:0:2}

mes=${data:3:2}

ano=${data:6:4}

echo

echo "A data digitada foi $dia de ${meses[$mes-1]} de $ano"

echo


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

Um exemplo simples de script

Analise e descreva o que faz o script a seguir, passo a passo:

#!/bin/bash --noprofile



# testar se ha um so parametro de entrada

if [ $# != 1 ]

then

echo "Erro na chamada"

echo "Uso: criadir numero de diretorios"

exit 1

fi



num=0



while [ $num -lt $1 ]

done

echo "Criando diretorio $num"

mkdir dir$num

num=$((num+1))

done



echo "Acabei de criar $1 diretorios"

exit 0

Agora, digite o script acima descrito no arquivo meuscript, em sua área de
trabalho, e teste-o.

Ps: Exemplos avançados, você encontrará nos Posts do nosso amigo CLoudy

------------------------------------------------------------------------------------------------------------------
Há, uma coisa pra ajudar vocês a li dár um pouco mais cedo com essa Linguagem Fantástica.

Apagar periodicamente arquivos mais velhos que 30 dias do diretório /tmp:

#!/bin/sh

cd /tmp
find . -type f -mtime +30 -delete

Este vem ao caso ser o conteúdo de um shell script que sempre que fosse executado apagaria arquivos com data de modificação maior que 30 dias a partir do diretório /tmp do sistema de arquivos. (Assim como alguns códigos de outras linguagens são usadas no Windows)
------------------------------------------------------------------------------------------------------------------

Fontes: Várias
Postado e Resumido por: Mim (Quak2)

Bem galerinha vou nessa..
Abraços por trás aew ... kpeakepekapea
;)

locator.dll


rodweb


jedi

Muito bom Quak2....

e issoaee cara... ta de parabens mereceu mesmo esse ponto +


flw brother.....


^^

rog

nao tem tempo de ler tudo mas

mount backserver.ppgia.pucpr.br:/backup /backup
isso e e a primeira vez que eu vejo isso

Apagar periodicamente arquivos mais velhos que 30 dias do diretório /tmp:
dê uma lida no /etc/init.d/bootmisc.sh

rog
realty.sys is corrupt :  reboot the universe (Y/N)

Ðark$pawn

Aê brother, voltando a ativa né... Abraços... ;)

Anonymous

Quote from: "rog"nao tem tempo de ler tudo mas

mount backserver.ppgia.pucpr.br:/backup /backup
isso e e a primeira vez que eu vejo isso

Apagar periodicamente arquivos mais velhos que 30 dias do diretório /tmp:
dê uma lida no /etc/init.d/bootmisc.sh

rog

@rog
Bem quanto á sua 1ª coisa nunca vista, é só um Exemplo de server de backup, só citei ali a variada, tendeu man?
Quando ao "Dê uma lida" verifiquei manu, vlw (Y)
Qqer coisa, só chamar.
abraço

Anonymous