所以,我只是尝试一个简单的程序。但问题是我想将某个文本更改为星号以隐藏文本,但希望星号或点的数量与字母的数量相同。这是我的代码...
#! /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 使用 * 作为通配符。