Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade do Grande Rio “Professor José de Souza Herdy” 1 - Introdução Este documento visa dar uma pequena abordagem sobre programas shell e a linguagem de programação shell script. 2 - O que é shell ? O shell é um programa interpretador de instruções/comandos, escrito em diferentes versões e atuam como interface entre os usuários e o sistema operacional, executando comandos lidos da entrada padrão ou de um arquivo. Com o shell é possível implementar uma linguagem de programação, que dispõe de comandos de decisão, controle de fluxo, funções, etc, chamada shell script. O Linux possui diversos tipos de interpretadores de comandos e, a maioria deles, pode ser listado no arquivo /etc/shells da sua distribuição. 2.1 Alguns tipos de shell Bash: Bourne-Again shell (padrão das distribuições Linux); Sh: Bourne shell; Csh: C shell; Ksh: Korn shell; 2.2 Diferenças entre os shells A sintaxe dos comandos internos (if, while, for, foreach, etc). Definição das variáveis (a=1, set a=1). Nas expressões. Os arquivos de inicialização (.profile, .bash_profile). Ver tabela ANEXO II. 2.3 Características dos programas shell: São interpretadores. Não fazem parte do sistema operacional. São interface entre usuário e sistema operacional. Utilizados como linguagem de programação. Estão definidos no último campo do arquivo /etc/passwd. 2.4 O que é um Shell Script? É uma lista de comandos em um arquivo texto, que serão interpretados pelo shell. 2.5 Qual o objetivo de usar Shell Script? Simplificar a execução de múltiplos comandos. Realização de ciclos repetitivos de tarefas. Tirar partido dos potentes comandos existentes no Linux/Unix. 2.6 Vantagens x Desvantagens Vantagens Linguagem interpretada (produtividade) Nativa do *n?x | *bsd (portabilidade) Visibilidade do ambiente (integração) Desvantagens Linguagem interpretada (performance) Não acessa ao hardware (como o C) Não tem acesso às GUIs (Graphical User Interface) 3. Variáveis em Shell Num conceito simples podemos dizer que variáveis são objetos básicos manipulados por programas e shell scripts. Os nomes das variáveis são da responsabilidade do usuário/programador e normalmente designadas "strings" nas outras linguagens de programação. 3.1 Critérios para criação de uma variável em shell nome a esquerda do sinal de igual e 1º caracter deve ser uma letra ou um underscore ("_"). Não pode haver espaço entre o nome e o valor atribuído à varialvel (a=10 ou _a=10). Restante do nome da variável pode ser constituído por letras, underscores ou algarismos. Não utilizar nomes de comandos para os nomes das variáveis. Não usar nomes de variáveis reservadas para o Shell (PATH, HOME...). 3.2 Como criar variáveis? var1=abcdef789 _var2="minha variável" Como utilizar as variáveis "var1" e "_var2" que foram criadas? echo $var1 Mostrará ---> abcdef789 echo $_var2 Mostrará ---> minha variável Outros exemplos de criação de variável: evento="Semana de Ciência e Tecnologia" readyonly local = "UNIGRANRIO" ← erro não pode haver espaço. readonly local=UNIGRANRIO readonly local="Universidade do Grande Rio" -bash: local: readonly variable ← erro Obs.: Variáveis criadas “readonly”, não podem ser alteradas ou removidas. 3.3 Como vejo as variáveis criadas no ambiente shell? Utilize o comando “set”, em conjunto com o pipe “|” e um paginador (more/less). set | more 3.4 Como remover uma variável? Utilize o comando unset nome_da_variável. unset variavel Obs.: Variáveis criadas como “readonly” não são removidas. 3.5 Variáveis pré-definidas e variáveis internas do SHELL. São variáveis do shell que armazenam informações sobre a sessão corrente. Em geral, estas variáveis são criadas em arquivos de inicialização e, repassadas ao ambiente shell do usuário. Veja exemplo abaixo. Variável Define HOME o diretório onde usuário é colocado no momento em que se loga. PATH diretórios de pesquisa, para tentar localizar um comando/programa especificado. PWD diretório corrente. LOGNAME login name do usuário. PS1 caracteres que compõem o prompt primário (default=$ ou # para root) PS2 caracteres que compõem o prompt secundário (default >) IFS contém o caracter que está servindo como separador default de campos $# total de parâmetros posicionais $* lista de parâmetros posicionais $! o PID do comando mais recente executado em retaguarda $? código de retorno de um comando $$ o PID do comando que está sendo executado $0 o próprio comando Atenção: Essas variáveis podem ser diferentes, ou seja, de acordo com o Shell utilizado. Exemplo para a variável PS1, que é uma variável do sistema e, qualquer valor que for dado a ela irá ficar como valor do prompt do usuário que você está logado. Alguns valores, como a seguir: \h Host da máquina \W Diretório Corrente \w Caminho completo do diretório corrente \u Nome do usuário \t Hora \\$ Fica $ se for usuário normal e # se for root Exemplo: export PS1="[\w/:\u:\t\\$]" 4. Funções Conjunto de comandos, com a finalidade de executar determinada tarefa. O shell aceita declarações de funções dentro de um ambiente shell, não sendo possível exportar funções. Utilidade: Na execução de pequenas operações com um bom desempenho, visto que uma função não é um arquivo e, desta forma, não é submetida ao processo normal de tratamento de arquivo e sim, a um conjunto de instruções gravadas no próprio ambiente shell do usuário, da mesma forma que uma variável. Sintaxe: <nome-função>() { <comandos> <comandos> bloco de comandos <comandos> } Exemplo: f_teste() { clear echo “funcao f_teste.” } Observação: A execução de uma função é pelo seu nome que neste caso é f_teste e, para remover uma função, utilize o comando “unset f_teste”. 5. Criando um Shell Script O primeiro passo na criação de um shell script, é criarmos um arquivo de texto com os comandos necessários, para dizer ao shell, que o arquivo de texto é um script e deve ser interpretado por ele. Para isto, devemos escrever na 1ª linha o código #!, que é o “magic code”. A seguir a este código, deve-se indicar o interpretador, que no nosso caso será /bin/bash, seguido dos parâmetros de configuração se desejar. A seguir, um pequeno exemplo de um shell script que na tela mostre: Ola! Meu primeiro script!!! Edite um arquivo conforme exemplo abaixo (usaremos o editor vi). # vi primeiro.sh #!/bin/bash # Este caractere, indica ao shell, que esta linha e um comentario. clear # Limpar toda a tela. Comentarios podem ser colocados apos um comando. # echo “Ola! Meu primeiro script!!!’ Salve o arquivo editado. Habilite permissão de execução para todos os usuários. # chmod a+x primeiro.sh Executando o script criado. # sh primeiro.sh ou ./primeiro.sh 5. 1 Comandos Intrínsecos (internos) do Shell O shell possui diversos comandos próprios, distintos do Linux, porém alguns com nomes semelhantes. A principal diferença desses comandos em relação aos do sistema é que esses não criam novos processos, não aumentando o número geral de processos no sistema e são de execução mais rápida. Podemos dividir os comandos em dois grupos: Comandos de finalidade genérica Comandos utilizados para a construção as estruturas de controle Comandos de finalidade genérica Comando cd - Troca o diretório de trabalho. Comando echo - Exibir/Mostra mensagens. Este comando é útil na construção de scripts para mostrar linhas de texto na tela para o usuário acompanhar sua execução. Obs.: A mensagem a ser exibida, deverá estarentre aspas duplas ( " ). echo "Alo mundo." Alo mundo. Outros exemplos. echo -e “Semana de Ciencia e Tecnologia.\n” echo -e “UNIGRANRIO – Universidade do Grande Rio.\n” echo “Sejam Bem-vindos!!!” Obs.: A opção “-e” habilita a interpretação de caracteres de escape (\n) na mensagem. Semana de Ciencia e Tecnologia. UNIGRANRIO - Universidade do Grande Rio Sejam Bem-vindos!!! unome="UNIGRANRIO – Universidade do Grande Rio" echo ${#UNOME} 39 unome="UNIGRANRIO - Universidade do Grande Rio." echo $unome | cut -c1-38 UNIGRANRIO - Universidade do Grande Ri echo ${unome:10} - Universidade do Grande Rio. Comando pwd - informa o nome do diretório de trabalho. pwd /home/suporte Comando exit - Faz o shell sair com um status de n. Se n é omitido, o status de saída é aquele do último comando executado. exit 1 Comando export - os nomes das variáveis são marcados para transporte automático para o ambiente dos processos filhos. Se não há argumentos, a lista das variáveis pertencentes ao ambiente de execução que será exportado, é impressa. sintaxe: export [nome...] Exemplo: export universidade=“Unigranrio” O exemplo acima exporta (globaliza) a variável “universidade”, com o valor igual à “Unigranrio”. Comando read - Captura dados do usuário e coloca numa variável. Exemplo: read nome read -p "Entre com seu nome :" nome echo "Eu sou o $nome e estudo na $universidade." sleep 5 clear Comando readonly - os nomes de parâmetros da lista são marcados como não alteráveis e os valores desses nomes não podem ser trocados por uma atribuição posterior. Se nenhum argumento for fornecido, é impressa a lista de todos os nomes marcados como não alteráveis. readonly meu_nome="Fulano de Tal" Comando set - lista as variáveis locais e globais no ambiente de shell. set HOME=/home/sop/curso HZ=50 IFS= MAILCHECK=600 OPTIND=1 PATH=:/usr/bin:/bin PS1=$ PS2=> SHELL=/bin/sh TERM=ansi TZ=BRASIL-3 Comando shift - desloca o parâmetro posicional $n+1 em $1, $n+2 em $2, e assim sucessivamente. shift [n] #/bin/bash clear echo “Antes do comando shift.” echo “Primeiro parametro eh:” $1 shift echo “Depois do comando shift.”: echo “Primeiro parametro eh:” $1 Comando test - avalia a expressão e retorna 0, se o seu valor for verdadeiro, e um valor diferente de 0 se for falso. test expressão Utilizar exemplo para o comando test Expressão Verdadeira se -z string tamanho de string é 0 -n string tamanho de string não é 0 (oposto de z) string1 = string2 a string1 é igual à string2 string1 != string2 a string1 é diferente à string2 int1 –eq int2 o int1é igual ao int2, equivale ao = int1 –ne int2 o int1é diferente do int2, equivale ao != int1 –gt int2 o int1é maior que o int2, equivale ao > int1 –ge int2 o int1é maior ou igual que o int2,equivale ao >= int1 –lt int2 o int1é menor que o int2,equivale ao < int1 –le int2 o int1é menor ou igual que o int2, equivale ao <= -r arquivo o arquivo existe e pode ser lido -w arquivo o arquivo existe e pode ser escrito -x arquivo o arquivo existe e pode ser executado -f arquivo o arquivo existe e é um arquivo normal -d arquivo o arquivo existe e é um directório Comando unset - remove uma variável ou função. unset nome_da_variavel Comando sleep - introduz uma temporização em segundos. sleep n echo "AGUARDANDO 5 segundos."; sleep 5 Como fazer aritmética ? Utilizando expr - os argumentos são avaliados como uma expressão e o resultado é impresso na saída padrão. Sintaxe: expr arg1 operador arg2 Exemplo expr 5 + 2 7 resultado Operadores: =, >=, <=, != :retorna o resultado (0=falso, 1=verdadeiro) de uma comparação de inteiros se ambos os argumentos forem inteiros, caso contrário, retorna o resultado de uma comparação léxica. +, -, *, /, % :retorna o resultado da adição, subtração, multiplicação, divisão e resto da divisão de argumentos com valor inteiro. Outros exemplos expr 10 / 5 2 expr 5 \* 10 50 expr 5 + 6 * 10 quando utilizar o curinga “*” para efetuar multiplicação, expr: syntax error expr 5 + 6 \* 10 devemos utilizar o “\” antes do “*”, para anulá-lo como curinga. 65 contador=1 contador=`expr $contador + 1` Observe o exemplo a seguir e responda. a=5 ; b=3 c=`expr $a + $b` d=`expr $a % $b` e=`expr $a \* $b` echo " c=$c - d=$d - e=$e " Qual o resultado para as variáveis “c, d, e” ? 5.2 Comandos utilizados para construção das estruturas de controle (1) Comando if, tratamento de alternativas. sintaxe: if lista de comandos 1 then lista de comandos 2 # obrigatório [else lista de comandos 3] # opcional fi - A lista de comandos 1 é executada e, se sua condição de retorno for igual a 0, a lista de comandos 2 será executada. Caso contrário, será executada a lista de comandos 3. Seja o conteúdo do arquivo “if.sh” a seguir. if test $1 = $2 then echo $1 e $2 são idênticos else echo $1 e $2 são diferentes fi (2) Comando case, seleções: sintaxe: case variável in [padrão [| padrão...])lista de comandos ;; ] esac O caracter "|" simboliza o operador lógico OU. O comando case executa a lista de comandos associada ao primeiro padrão com o qual a variável se encaixa. A forma de expressar os padrões é a mesma usada para os identificadores de arquivo. Veja o conteúdo do arquivo “case.sh” a seguir. case $1 in a) echo ocorrência de a ;; b|c) echo ocorrência de b ou c ;; ?) echo ocorrência de qualquer caracter diferente de a,b e c ;; *) echo ocorrência de qualquer cadeia com mais de um caracter ;; esac sh case.sh x será mostrado ocorrência de qualquer caracter diferente de a,b ou c sh case.sh bb será mostrado ocorrência de qualquer cadeia com mais de um caracter (3) Comandos para Iterações (repetições). Existem duas categorias de iterações: . enumerativa . condicional (a) Comando for, iteração enumerativa for variavel [in lista_de_valores] do comando1 comando2 .... done - Toda vez que o comando for é executado, é feita a atribuição da variável com a próxima palavra da lista de palavras, após in. Se "in palavra..." é omitido, o comando for executa a lista de comandos, uma vez para cada parâmetro posicional. A execução termina quando não há mais palavras ou quando o parâmetro posicional é nulo. Veja o conteúdo do arquivo “for.sh” a seguir. for i in um dois tres do echo $i done (b) Iterações condicionais Comando while: while lista de comandos1 do [lista de comandos2] done - O comando while executará repetidamente a lista de comandos 2, enquanto a condição de retorno do último comando da lista de comandos 1 for 0, caso contrário terminará. Veja o conteúdo do arquivo “while.sh” a seguir. while [ $# != 0 ] do echo $1 shift done Comando until: until lista de comandos 1 do [lista de comandos 2] done O comando until executará repetidamente a lista de comandos 2, enquanto a condição de retorno do último comando da lista de comandos 1 for diferente de 0, caso contrário terminará. Veja o conteúdo do arquivo “until.sh” abaixo. until [ $# = 0 ] do echo $1 shift done - Comando break - rompe a iteração em curso. Comando continue - rompe a iteração em curso, e permite continuar no início do bloco corrente. Dá continuidade ao laço iniciado pelo “while”. Veja o exemplo do arquivo “continue.sh” abaixo. while [ $# != 0] do if [ -f $1 ] then echo "O Arquivo $1 existe." shift continue fi case $1 in manga|abacaxi) echo "Que delícia !!!" ;; fim) break ;; esac shift done Anexo I - Retirado do Guiafoca. “Esta seção contém os comandos equivalentes entre estes dois sistemas e a avaliação entre ambos. Grande parte dos comandos podem ser usados da mesma forma que no DOS, mas os comandos no Linux possuem avanços para utilização neste ambiente multiusuário/multitarefa.” DOS Linux Diferenças -------- ------------ ----------------------------------------------- cls clear Sem diferenças dir ls -la A listagem no Linux possui mais campos (permissões de acesso) e o total de espaço ocupado no diretório e livre no disco deve ser visto separadamente usando o comando du e df. Permite também listar o conteúdo de diversos diretórios com um só comando (ls /bin /sbin ). dir/s ls -lR Sem diferenças. dir/od ls -tr Sem diferenças. cd cd Poucas diferenças. cd sem parâmetros retorna ao diretório de usuário e também permite o uso de "cd -" para retornar ao diretório anterior acessado. del rm Poucas diferenças. O rm do Linux permite especificar diversos arquivos que serão apagados(rm arquivo1 arquivo2 arquivo3). Para ser mostrado o arquivo apagado, deve- se especificar o parâmetro "-v" ao comando, e "-i" para pedir a confirmação ao apagar arquivos. md mkdir Uma só diferença: No Linux permite que vários diretórios sejam criados de uma só vez (mkdir /tmp/a /tmp/b). copy cp Poucas diferenças. Para ser mostrado os arquivos enquanto estão sendo copiados, deve-se usar a opção "-v", e para que ele pergunte se deseja substituir um arquivo já existente, deve-se usar a opção "-i". echo echo Sem diferenças. path path No Linux deve ser usado ":" para separar os diretórios e usar o comando "export PATH=caminho1:/caminho2:/caminho3:" para definir a variável de ambiente PATH. O path atual pode ser visualizado através do comando "echo $PATH". ren mv Poucas diferenças. No Linux não é possível renomear vários arquivos de uma só vez (como "ren *.txt *.bak"). É necessário usar um shell script para fazer isto. type cat Sem diferenças. ver uname -a Poucas diferenças (o uname tem algumas opções a mais). date date No Linux mostra/modifica a Data e Hora do sistema. time date No Linux mostra/modifica a Data e Hora do sistema. attrib chmod O chmod possui mais opções por tratar as permissões de acesso de leitura, gravação e execução para donos, grupos e outros usuários. scandisk fsck O fsck é mais rápido e extensivo na checagem. doskey ----- A edição de teclas é feita automáticamente pelo sh em alguns sistemas linux. edit vi O edit é mais fácil de usar, mas usuários experientes apreciarão os recursos do vi. help man, info Sem diferenças. ANEXO II Tabela de Equivalência entre: sh, csh, bash e ksh sh csh bash ksh Redirecionamento de Entrada/Saída < > >> | idêntico idêntico idêntico File name substitution ? * [ ] idêntico idêntico idêntico Varáveis do Shell HOME PATH SHELL MAIL TERM home path shell mail term HOME PATH SHELL MAIL TERM HOME PATH SHELL MAIL TERM Arquivo usado na hora do login .profile .login .bash_profile .profile Operações com variáveis var=valor var=`comando` var=`expr $var + 1` set var = valor set var = `comando` @ var = $var + 1 var = valor var = `comando` var=`expr $var + 1` var = valor var = `comando` var=`expr $var + 1` Prompt padrão do usuário root/comum # / $ # / % # / $ # / $ Comentário # comentário # comentário # comentário # comentário Comandos if [ test expr ] then ... fi if ( C expr ) then ... endif if [ test expr ] then ... fi if [ test expr ] then ... fi if [ test expr ] then ... else fi if ( C expr ) then ... else ... endif if [ test expr ] then ... else fi if [ test expr ] then ... else fi for var in words do ... done foreach var ( words ) ... end for var in words do ... done for var in words do ... done Bibliografia http://www.docstoc.com/docs/49851554/Shell-Scripting-Dicas-Truques-e-Ma-cetes, acessado em 06/09/2010. http://www.guiafoca.org Joel Saade, (2001). Bash - Guia de Consulta Rápida. Rubem E. Ferreira, (2003). Linux - Guia de Administração do Sistema. Novatec. Neves, Julio Cezar. “Programação Shell Linux”. 4ª Ed. Rio de Janeiro: Brasport, 2004. 336pp. � � Internas do shell
Compartilhar