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

时间:2012-11-02 19:48:51

标签: bash

您知道有一个名为read的内置Bash命令。如果我想在我的脚本中执行此操作该怎么办:

read PASSWROD

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

4 个答案:

答案 0 :(得分:24)

学习如何手动bash的时间(在bash手册中,这是来自Bash 4.1版本)。相关选项为-s

  

read

     

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

     

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

     

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

     

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

     

-a aname将单词分配给数组变量的顺序索引   aname,从0开始。所有元素都从aname中删除   分配。其他名称参数将被忽略。

     

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

     

-e使用Readline(参见第8章[命令行编辑],第93页)   获得这条线。 Readline使用当前(或默认,如果行)   编辑以前没有激活)编辑设置。

     

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

     读取nchars字符后,

-n nchars读取返回而不是等待   对于完整的输入行,但如果少于,则表示分隔符   在分隔符之前读取nchars字符。

     

-N nchars在读取完全nchars字符后读取返回而不是   等待完整的输入线,除非遇到EOF或   读出时间。输入中遇到的分隔符是   没有特别处理,并且在nchars之前不会导致读取   字符被阅读。

     

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

     

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

     

-s无声模式。如果输入来自终端,则字符不是   呼应。

     

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

     

-u fd从文件描述符fd。

读取输入

因此,在错字修正后,您需要:

read -s -p "Password: " PASSWORD

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

答案 1 :(得分:8)

您可以使用以下几行:

stty -echo
read -p "Password: " passw; echo
stty echo

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

答案 2 :(得分:2)

您可以使用终端设置关闭回声:

#!/bin/bash
# Disable echo
stty -echo

#Prompt and read password
printf "Password: "
read PASSWORD

# Turn echo back on
stty echo
printf "\n"

答案 3 :(得分:1)

read -s -p "Password: " passw 

适用于bash