将文本显示为星号

将文本显示为星号

所以,我只是尝试一个简单的程序。但问题是我想将某个文本更改为星号以隐藏文本,但希望星号或点的数量与字母的数量相同。这是我的代码...

#! /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 

所以我希望涵盖这部分:echo Confirm Password: $pass?。我不保存任何数据,所以我只是想隐藏文本。

答案1

那么当用户输入密码时blahblah,要显示什么********?这并不算什么确认,他们将无法检查他们输入的内容。

但是,您可以通过使用字符串替换扩展来做到这一点${var//pattern/replacement}(在 Bash 和其他 shell 中,而不是标准 POSIX shell):

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

匹配?任何字符,//告诉替换所有匹配项,因此所有字符都更改为星号。注意引号;如果没有它们,该单词将扩展为文件名,并且星号匹配当前目录中的所有文件。

答案2

$ echo "hello there"
hello there

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

转义字符的需要将取决于您的本地设置,并且需要一些尝试和错误。

答案3

这不是一个精确的解决方案。但是,使用 bash 可以通过使用来实现类似的效果转义序列。可以相对轻松地删除或完全隐藏一段文本。只需将您的确认行更改为以下内容即可。

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

这会将密码中的每个字符打印为空格。 8 可以改为 9 以表示删除线。请注意,^[不是这些文字字符,而是一个特殊字符,可以通过按 ctrl+v 然后 esc 插入。

如果需要打印星号来代替字符,您最好定义如下所示的函数。

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

然后可以像这样使用该函数:

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

可能需要进行一些额外的转义以避免 shell 使用 * 作为通配符。

相关内容