Buscar

doc 13 shell

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

Continue navegando