Você está na página 1de 3

Respostas dos Exercícios do Tópico 105

Resultados iguais podem ser obtidos por maneiras e comandos diferentes. O


importante aqui é praticar e obter as respostas esperadas.

105.1 Customização e Uso do Ambiente Shell


1.
Inserir no arquivo /etc/profile a seguinte função
function inicio {
clear
echo "Seja bem-vindo $USER"
echo "Este sistema está ativo desde `uptime -s`"
echo ""
echo "Bons Estudos!"
}

2.
No arquivo ~/.profile (ou ~/.bash_profile ou ~/.bash_login se existirem), insira na
última linha a chamada para a função inicio.

3.
Edite o arquivo /etc/skel/.profile, e insira na última linha a chamada para a função
inicio.

4.
A opção do rm que inclui uma confirmação em todo o comando é o -i. Desta forma,
basta criar um alias que substitua o comando rm por rm –i.
Insira no /etc/profile, ou no /etc/bash.bashrc já que ele também será executado
durante os logins, a linha abaixo:
alias rm=”rm –i”
105.2 Customização e Criação de Scripts Simples
5.
Abaixo o código do script. Lembre-se que mesmos resultados podem ser obtidos de
maneiras diferentes.
#!/bin/bash
echo "Escolha a opção desejada:"
echo "1 - Fazer uma contagem regressiva começando do número informado
como parâmetro"
echo "2 - Verificar se o parâmetro informado é um arquivo presente no
diretório /etc/"
echo "3 - Analisar o /etc/passwd e exibir apenas o nome do usuário
(campo 1) e seu ID (campo 3), considerando linhas que possuam
/bin/bash"
echo ""
echo -n "Opção Escolhida: "
read OPCAO
echo ""
case $OPCAO in
1)
if [ $1 -gt 0 2> /dev/null ]; then
echo "Começando a contagem regressiva: "
VAR1=$1
until [ $VAR1 -lt 0 ]
do
echo "O valor atual é : $VAR1"
sleep 1
VAR1=`expr $VAR1 - 1`
done
else
echo "Insira um numero maior que zero como parametro"
fi
;;
2)
if [ $1 ]; then
FILE=`find /etc/ -name $1 2> /dev/null`
if [ $FILE ]; then
echo "O arquivo $1 existe em $FILE"
else
echo "O arquivo $1 não existe"
fi
else
echo "Nenhum parâmetro foi informado"
fi
;;
3) OLDIFS=$IFS # Fazendo um backup do valor anterior do IFS. Ver
explicação abaixo
IFS=$'\n’ # Definindo o IFS para considerar apenas a quebra de
linha como separador
echo "Os usuários do sistema são:"
for i in `grep "/bin/bash" /etc/passwd`
do
USUARIO=`echo $i| cut -f1 -d":"`
ID=`echo $i| cut -f3 -d":"`
echo "Usuário $USUARIO - ID $ID"
done
IFS=$OLDIFS # Retornando o valor do IFS padrão
;;
*)
echo "Opcão Invalida."
;;
esac

*** O IFS ***


O bash tem uma variável de ambiente chamada IFS (Internal Field Separator) que
basicamente indica os separadores de campo padrão. Por padrão o valor do IFS é " \t\
n", o que significa que ele considera um espaço, um tab ou uma nova linha como
separador de campo.
Quando você usa o grep em um for o IFS é considerado, o for vai fazer um iteração a
cada conjunto de caracteres retornado pelo grep, e esse conjunto de caracteres é
separado pelo que é definido no IFS.

Sendo assim, o problema acontece porque normalmente na descrição do nome do


/etc/passwd há um espaço, e com isso é iniciada uma nova iteração do for não
desejada.

A solução para isso é configurar temporariamente o IFS para o que nos interessa.

O detalhe do IFS não cai nos exames de certificação, mas foi necessário para esse
exercício.

Você também pode gostar