Mostrar texto como asteriscos

1

Então, estou apenas experimentando um programa simples. Mas a coisa é que eu quero mudar um certo texto para asterisco para esconder o texto, mas quero que o número de asteriscos ou pontos seja o mesmo que o número de letras. Aqui está o meu código ...

#! /bin/bash
read -p 'Username:' name
read -sp 'Password:' pass
echo Confirm Username: $name?
echo Confirm Password: $pass?
echo Let us start the quiz :P
echo Q1 - Full form of MCQ
echo a - Maximum Capture Quest
echo b - Multiple Choice Question
read -p "Your Answer:" word
if [[ $word == "b" ]]
then
  echo "Correct! V.Good"
else
  echo "Wrong."
fi 

Então, quero que essa parte seja coberta: echo Confirm Password: $pass? . Eu não estou salvando nenhum dado, então eu simplesmente quero o texto oculto.

    
por Rohin 18.06.2017 / 11:48

3 respostas

2

Assim, quando o usuário digitar a senha blahblah , você deseja mostrar ******** ? Isso não é muito de uma confirmação, eles não serão capazes de verificar o que eles digitaram.

Mas, você pode fazer isso usando a expansão de substituição de string ${var//pattern/replacement} (no Bash e outros shells, não no shell POSIX padrão):

#!/bin/bash
read -sp "Password: " pass
echo
echo "Confirm Password: ${pass//?/*}"

O ? corresponde a qualquer caractere, // diz para substituir todas as correspondências, para que todos os caracteres sejam alterados para asteriscos. Observe as citações; sem eles, a palavra seria expandida para nomes de arquivos e os asteriscos corresponderiam a todos os arquivos no diretório atual.

    
por 18.06.2017 / 15:09
0
$ echo "hello there"
hello there

$ echo "hello there" | tr -c \n \*
***********

A necessidade de escapar caracteres será baseada em sua configuração local e exigirá algumas tentativas e erros.

    
por 18.06.2017 / 13:42
0

Esta não é uma solução exata. Mas, com bash, algo semelhante pode ser alcançado usando seqüências de escape . Um pedaço de texto pode ser atingido ou completamente oculto com relativa facilidade. Basta alterar sua linha de confirmação para o seguinte.

echo Confirm Password: ^[[8m$pass^[[0m?

Isso imprimirá cada caractere na senha como um espaço em branco. O 8 pode ser alterado para um 9 para rasurado em vez disso. Observe que o ^[ não é esses caracteres literais, em vez disso, é um caractere especial que pode ser inserido pressionando ctrl + v e depois esc.

Se for necessário imprimir asteriscos no lugar dos caracteres, talvez seja melhor definir uma função como a seguinte.

function nstars {
    for i in $(seq $1); do
        echo -n '*'
    done
}

Essa função pode ser usada assim:

echo Confirm Password: $(nstars ${#pass})?

Provavelmente será necessário fazer algum escape extra para evitar que o shell use * como um caractere de globbing.

    
por 18.06.2017 / 14:31