Shell Script – Read

Vamos conhecer um comando bastante utilizado em scripts onde há interação com o operador, vamos conhecer ele.

O nome do comando já defini sua função “ler”, mas ler o que, de onde, do que e como? Algumas das opções de usar read são:

-a Todas as opções irá ser armazenadas em um array até você pressionar ENTER
-d Caractere delimitador, só irá sair quando ele for informado
-e Readline é utilizado para obter o valor se é proveniente de um terminal
-i Usa um texto inicial de readline
-n Seta o numero de caracteres a ser digitado antes de continuar
-p Prompt interativo, onde você pode informar uma string a ser exibida e irá ler o que voce digitar
-r Elemina o uso de para caracteres de escape, nunca precisei utilizar este
-s Silent mode, não é feito o echo do que é digitado, como digitar senha no terminal
-t Timeout, tempo limite que irá aguardar o operador digitar algo
-u Lê a partir de um file descriptor no lugar do input do terminal

Estrutura para uso do read:

echo "Digite seu nome: "
read NOME

Vamos ao exemplo ExRead01.sh:

#!/bin/bash
# O exemplo mais básico com read, armazenando o valor digitado na variável NOME
echo -e "Digite seu nome:"
read NOME

# Utilizando -p e uma string, ignorando o uso do echo e armazenando na variável IDADE
read -p "Digite sua idade: " IDADE

# Utilizando -a para uma array de opções, sendo digitado com espaços e finalizando com ENTER
read -a DISTRIBUICOES -p "Informe as distribuições linux que você usa: "

# Mostrando na tela do que foi digitado
echo
echo -e "Seu nome: $NOMEn"
echo -e "Sua idade: $IDADEn"
echo -e "Voce usa as seguintes Distribuicoes: "
for dist in ${DISTRIBUICOES[@]}
do
echo "$dist"
done

Saída:

cleiton@linuxVM:~/projetos/shell script/read_shift$ ./ExRead01.sh
Digite seu nome:
Cleiton Bueno
Digite sua idade: 26
Informe as distribuições linux que você usa: Ubuntu Debian Mint CentOS Fedora Debian

Seu nome: Cleiton Bueno

Sua idade: 26

Voce usa as seguintes Distribuicoes:
Ubuntu
Debian
Mint
CentOS
Fedora
Debian
cleiton@linuxVM:~/projetos/shell script/read_shift$

Acho que ficou bem fácil de ver o uso do read e o mesmo com as opções -p e -a, fácil não?
Agora vamos a outro exemplo pratico o ExRead02.sh:

#!/bin/bash

clear

echo -e "Sistema de autenticacao 1.0"

# O operador tem 5s para informar o usuario
# caso contrario o script excede o timeout
# entra no if que verifica se a variavel é nula
# caso seja finaliza o script
echo -e "Voce tem 5 segundos para informar o usuario..."
read -p "Usuario: " -t 5 USER

if [ -z $USER ]; then
echo -e "nUsuario em branco"
exit 0
fi

read -s -p "Password: " PASSWD
echo -e "n"
read -p "Informe um codigo de seguranca de 8 digitos: " -n 8 COD

echo -e "nnn"
echo -e "Informacoes cadastradas com sucesso!"
echo -e "nUsuario: $USERnSenha: $PASSWDnCodigo: $COD"

Saída:

Sistema de autenticacao 1.0
Voce tem 5 segundos para informar o usuario...
Usuario: bueno
Password:

Informe um codigo de seguranca de 8 digitos: 12345678

Informacoes cadastradas com sucesso!

Usuario: bueno
Senha: senha
Codigo: 12345678
cleiton@linuxVM:~/projetos/shell script/read_shift$

Ou se demorar mais de 5s para digitar o usuário:

Sistema de autenticacao 1.0
Voce tem 5 segundos para informar o usuario...
Usuario:
Usuario em branco
cleiton@linuxVM:~/projetos/shell script/read_shift$

Neste exemplo fizemos uso dos parâmetros -t de timeout no usuário onde especificamos o tempo de 5 segundos, o -s na senha para não echoar o que é digitado e -n para forçar digitar 8 caracteres para um código de segurança.
Nosso próximo exemplo é o script que faz uso do parâmetro de delimitador -d, vamos ver o ExRead03.sh:

#!/bin/bash

read -p "Digite e finalize com @: " -d'@' FRAME
echo -e "nnFrame digitado foi:t$FRAME"

Saída:

cleiton@linuxVM:~/projetos/shell script/read_shift$ ./ExRead03.sh
Digite e finalize com @: S:100:12:12:34:556:FIM@

Frame digitado foi: S:100:12:12:34:556:FIM
cleiton@linuxVM:~/projetos/shell script/read_shift$

Para encerrar o comando read um ultimo exemplo utilizando o parâmetro -u que só notei esse comando quando precisei uma vez e pesquisei, então vamos ver o ExRead04.sh:

#!/bin/bash

# Exemplo de uso pratico 1
echo -e "Informe o device. Ex: [/dev/sda]"
read DEVICE

# -p Prompt, -n Numero de caracteres para sair
read -p "Deseja formatar $DEVICE? [s/n] " -e -n 1 OP

case $OP in
(s|S)
for prog in $(seq 10);
do
echo -n "###"
sleep 1
done
echo -ne "[100%]n"
;;
(n|N) echo -e "n"; exit 0 ;;
(*) echo -e "nOpcao Invalidan"; exit 0 ;;
esac

# Exemplo de uso pratico 2
echo
echo -e "nLendo um arquivo e trabalhando com file descriptor com readn"
LINHAS=$( wc -l /etc/hosts | cut -d" " -f1)

# Criando file descriptor com conteudo do /etc/hosts
exec 345< /etc/hosts

for ((i=0; i<$LINHAS; i++))
do
read -u 345 a$i
done
# Finalizando o file descriptor
exec 345<&-

echo -e "Linha1: $a0"
echo -e "Linha2: $a1"
echo -e "Linha3: $a2"
echo -e "Linha4: $a3"

# Exemplo de uso pratico 3
echo
echo -e "nLendo um arquivo e trabalhando direto com read e estrutura de repeticaon"
count=1
cat /etc/passwd | cut -d":" -f1 | while read line
do
echo Linha $count : $line
count=$[ $count + 1 ]
done

exit 0

Saída:

cleiton@linuxVM:~/projetos/shell script/read_shift$ ./ExRead04.sh
Informe o device. Ex: [/dev/sda]
/dev/sdc1
Deseja formatar /dev/sdc1? [s/n] s
##############################[100%]

Lendo um arquivo e trabalhando com file descriptor com read

Linha1: 127.0.0.1 localhost
Linha2: 127.0.1.1 linuxVM
Linha3: 127.0.0.1 gateway
Linha4: 127.0.0.1 vm02.intranet

Lendo um arquivo e trabalhando direto com read e estrutura de repeticao

Linha 1 : root
Linha 2 : daemon
Linha 3 : bin
Linha 4 : sys
Linha 5 : sync
Linha 6 : games
Linha 7 : man
Linha 8 : lp
Linha 9 : mail
Linha 10 : news
Linha 11 : uucp
Linha 12 : proxy
Linha 13 : www-data
Linha 14 : backup
Linha 15 : list
Linha 16 : irc
Linha 17 : gnats
Linha 18 : nobody
Linha 19 : libuuid
Linha 20 : syslog
Linha 21 : messagebus
Linha 22 : avahi-autoipd
Linha 23 : avahi
Linha 24 : usbmux
Linha 25 : gdm
Linha 26 : speech-dispatcher
Linha 27 : kernoops
Linha 28 : pulse
Linha 29 : rtkit
Linha 30 : hplip
Linha 31 : saned
Linha 32 : cleiton
Linha 33 : sshd
Linha 34 : mysql
Linha 35 : postgres
Linha 36 : Debian-exim
Linha 37 : snmp
Linha 38 : postfix
Linha 39 : fetchmail
Linha 40 : proftpd
Linha 41 : ftp
cleiton@linuxVM:~/projetos/shell script/read_shift$

Esse ultimo reuniu algo interessante de usar com switch|case e o parâmetro -u, onde fiz uma brincadeira onde o operador informa um device do Linux e depois perguntar de deseja formatar, que é um parâmetro -n 1 que será s ou n, se for algo diferente ele sai do script e caso seja n também irá finalizar o script e teclando s faz uma sacadinha com uma barra progressiva inofensiva pois não estará formatando nada neste script.
Depois faço o uso do -u onde na linha 26 eu obtenho quantas linhas tem meu arquivo /etc/hosts, e na linha 29 crio o file descriptor com o conteúdo do /etc/hosts e em seguida entro em uma repetição de 0 até o numero de linhas do meu arquivo e usando read -u aponto meu descritor e vou associando cada linha a uma variável $a[NUMERO_DO_FOR], na linha 36 finalizo o file descriptor com o & para dizer que não é um arquivo que vem e mostro as primeiras quatro linhas com echo na linha 38 a 41, em breve irei escrever um post sobre exec.
Em seguida tenho outra aplicação usando read para ler um arquivo inteiro no caso o conteúdo do /etc/passwd e filtrando apenas a primeira coluna usando o cut e um pipe usando while read line e dentro da estrutura de repetição while dou um echo identificando todas as linhas.

Comando read é bastante utilizado em scripts interativos e que não seja apenas funcional com passagem de parâmetros, passei praticamente todas as funções do manual page e até uma sacadinhas com esse ultimo script e agora você use sua imaginação e o conteúdo que vimos até agora e boa diversão.

Até a próxima!

Referências

http://linuxcommand.org/lc3_man_pages/readh.html
http://www.cyberciti.biz/faq/?s=read

Share Button

CC BY-NC-SA 4.0 Shell Script – Read by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.