如何使用Bash"read"命令保证读取?

Dan*_*iel 11 bash

你知道有一个内置的Bash命令read.如果我想在我的脚本中执行此操作,该怎么办

read PASSWROD
Run Code Online (Sandbox Code Playgroud)

当它提示我输入时,我的所有输入都是可见的.是否有替代命令可以使输入不可见.

Jon*_*ler 24

是时候学习如何手动bash(在bash手册中,也就是说;这是来自Bash 4.1版本).相关选项是-s.

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt]

[-t timeout] [-u fd] [name ...]

从标准输入读取一行,或从作为-u选项的参数提供的文件描述符fd读取,第一个单词分配给第一个名称,第二个单词分配给第二个名称,依此类推,剩下的单词和他们的干预分隔符被分配到姓氏.如果从输入流中读取的字数少于名称,则为其余名称分配空值.IFS变量值中的字符用于将行拆分为单词.反斜杠字符\可用于删除下一个字符读取和行继续的任何特殊含义.如果未提供名称,则将读取的行分配给变量REPLY.返回代码为零,除非遇到文件结束,读取超时(在这种情况下返回代码大于128),或者提供无效的文件描述符作为参数-u.

选项(如果提供)具有以下含义:

-a aname这些单词被分配给数组变量aname的顺序索引,从0开始.所有元素在赋值之前从aname中删除.其他名称参数将被忽略.

-d delim delim的第一个字符用于终止输入行,而不是换行符.

-eReadline(参见第8章[命令行编辑],第93页)用于获取该行.Readline使用当前(或默认,如果行编辑以前未激活)编辑设置.

-i text 如果使用Readline读取行,则在编辑开始之前将文本放入编辑缓冲区.

-n nchars 读取nchars字符后读取返回,而不是等待完整的输入行,但如果在分隔符之前读取的字符数少于nchars,则会遵循分隔符.

-N nchars读取完全nchars字符后读取返回,而不是等待完整的输入行,除非遇到EOF或读取超时.输入中遇到的分隔符不会被特殊处理,并且在读取nchars字符之前不会导致读取.

-p prompt在尝试读取任何输入之前,显示提示,没有尾随换行符.仅当输入来自终端时才会显示提示.

-r如果给出此选项,则反斜杠不会充当转义字符.反斜杠被认为是该行的一部分.特别是,反斜杠 - 换行符对不能用作行继续.

-s静音模式.如果输入来自终端,则不回显字符.

-t timeout 如果在超时秒内未读取完整的输入行,则会导致读取超时并返回失败.超时可以是十进制数,小数点后面的小数部分.此选项仅在读取来自终端,管道或其他特殊文件的输入时有效; 从常规文件中读取时没有任何效果.如果timeout为0,如果输入在指定的文件描述符上可用,则read返回成功,否则失败.如果超出超时,则退出状态大于128.

-u fd 从文件描述符fd读取输入.


因此,在拼写错误修复后,您需要:

read -s -p "Password: " PASSWORD
Run Code Online (Sandbox Code Playgroud)

您可能希望echo在它之后立即添加一个,因为换行也没有回显(虽然它不包含在密码中).


squ*_*guy 8

您可以使用以下几行:

stty -echo
read -p "Password: " passw; echo
stty echo
Run Code Online (Sandbox Code Playgroud)

这将echo在密码读取之间打开和关闭.