Page 1
Exercícios de Introdução a Programação em Bash Shell
Referências . Pagina www.di.ubi.pt/~operativos Unix Documents
A quick guide to writing scripts using the bash shell
Advanced Bash Scripting Guide : the Linux Documentation Project
1. Variáveis
Faça um bash shell script chamado vars para experimentar com variáveis
#!/bin/bash
# variaveis de ambiente
echo $PATH
echo $USER $HOME
# pode-se ver todas as variáveis do ambiente com o comando env | less
#variaveis locais
ola="bom dia"
echo "$ola Paulo"
echo "$olaPaulo"
$Texto Pegado a variavel ..
echo "${ola}Paulo"
#proteger a variável com as chavetas
mesg="$ola $USER"
echo $mesg
# input
echo "Introduza qualquer Coisa" ; read var
echo "Introduziu $var"
# execução
data=`date`
echo $data
info=`echo $HOME ; echo " estamos em "; pwd`
echo $info
# contas
x=1
let x=x*2+3
echo "x=$x"
let x--
echo "x=$x"
#variaveis especiais
echo "Numero de Arguments para este script $#"
echo "Todos os argumentos para este script $*"
echo "O primeiro $1 e segundo $2 argumentos"
echo "O nome deste ficheiro $0"
echo "O Processo ID deste script $$"
echo "Exit status do comando anterior $"”

Page 2
2. mywho
(a) Faça um bash shell script chamado mywho que aceita um string como parâmetro. O script deverá indicar se
existe um utilizador actual do sistema cujo username contêm o string. Se for o caso o script deverá executar o
comando finger filtrando o output pelo valor do string.
Modifique o script em baixo :
solução : Em vez de ler o “nome” com o comando read utilizar-se-á a variável $1.
2 (b) Generalizar o script para aceitar N parâmetros
utilizar a estrutura for variavel in $x do .. done
Antes de generalizar Experimente o seguinte Script teste
Experimente em utilizar y="ola bom dia" e depois um ciclo pelo y .. for x in $y
#!/bin/bash
# mywho versão inicial
echo "Introduza Nome (userid) da Pessoa " ; read nome
echo "Procurando "$nome
# comando who seguido por um filtro.
who | grep $nome
# Nota : exit status of previous comand is stored in is $?
# Default is valor 0 indicates sucess.
if [ $? -eq 0 ] ; then
echo "$nome Foi Encontrado "
else
echo "$nome Não Foi Encontrado "
fi
echo
#!/bin/bash
# script teste
for x in $*
do
echo "Argumento $x"
done
[crocker@penhas p2]$ teste 12 in ola
Argumento 12
Argumento in
Argumento ola

Page 3
[crocker@penhas p2]$ fichas
Ficheiro 1 ex1.c
Ficheiro 2 fichas
Ficheiro 3 g1.c
Ficheiro 4 tmp
Ficheiro 5 stack.c
3 Testes de Decisão (if/case)
Faça um bash shell script que apresente ao utilizador um menu onde o utilizador pode escolher entre duas opções.
A primeira opção deverá mostrar o calendário do mês actual e a segunda a data actual
Utilizar: a estrutura if.. then..else..fi
3 (b) Adicione mais três opções, “calendário do ano actual”, “o numero de segundos desde 1970” e a “o
calendário do ano 1752”
Para a estrutura da decisão utilize a instrução case.
Se o utilizador escolher uma opção invalida deverá aparecer a mensagem “opção invalida”
Dicas:
ver o sintaxe da instrução case no Advanced Bash Scripting Guide : the Linux Documentation Project
ver as ajudas dos comandos cal e date.
3 (c) ( difícil ) Mais uma opção . A data em português !!
4 Atribuição por execução e Ciclos
Faça um bash shell script, fichas, que faça uma listagem dos ficheiros no directório actual na seguinte forma
Utilizar uma variável para guardar os nomes dos ficheiro
f=`ls` ... Seguido por um ciclo for variavel in $f do .. done
5 while
Faça um bash shell script, enquanto, que faça uma contagem a partir do valor do seu primeiro argumento até o
valor do segundo
#!/bin/bash
# script not-quite-enquanto
cnt=1
while [ $cnt –le 10 ]
do
echo "cnt $cnt"
let cnt++
done
[crocker@penhas p2]$ contar 5 2
cnt 5
cnt 4
cnt 3
cnt 2

Page 4
[crocker@penhas p2]$ imprimir 12 in ola
usage ./imprimir argumentos
Argumento Numero 1 = 12
Argumento Numero 2 = in
Argumento Numero 3 = ola
6. wcnovo
Faça um bash shell script, wcnovo, que mostre apenas o numero de palavras e linhas de cada ficheiro do directório
actual.
6 (b) Altere o script para que no fim apresentará o numero total de palavras e linhas de todos os ficheiros do
directório.
7 until/shift
Faça um bash shell script, imprimir, que imprime todos os parâmetros do script na seguinte forma
Utilizar a estrutura, until [ -z $1 ] do ... shift .. done para fazer um ciclo pelas variáveis.
Nota: Os scripts devem ser acessíveis a partir de qualquer directório do seu login shell. Por isso coloca os seus
scripts no directório ~/bin e altere o seu path se for necessário.
Check List
Path. Está incluido o directório actual o simbolo “.” No seu PATH ? E o directório $HOME/bin ?
Ficheiro .bash_profile. Existe ? export path ? Está a ler o ficheiro .bashrc e .alias ?
Ficheiro .alias. Existe ? Tem os seus aliases ?