如何将 read -s 与 printf 一起使用

如何将 read -s 与 printf 一起使用

如果我使用“read -s”,它将删除现有行并将下一个提示带到同一行,如下所述。请让我知道此错误的任何解决方案。我需要使用“-s”来读取而不是在屏幕上回显密码。

脚本:


$ cat a.sh
printf "Enter the db name : "
read -r sourcedb
printf "Enter the source db username: "
read -r sourceuser
printf "Enter the source database password: "
read -s sourcepwd;
printf "Enter the target database username: "
read -r targetuser

电流输出:


$ ./a.sh
Enter the db name : ora
Enter the db username: system
Enter the db password: Enter the target database username:

期望的输出:


$ ./a.sh
Enter the db name : ora
Enter the db username: system
Enter the db password: 
Enter the target database username:

我正在使用Linux。

答案1

-s不是该read实用程序的标准选项。在 ksh 中,-s是保存 shell 历史记录中的输入,在 bash 和 zsh 中,是抑制终端回显,在大多数其他 shell 中,这是一个无效选项,因此您需要指定 she-bang 并更改误导性扩展名,.sh如果你想使用它。

抑制终端echo意味着按下时回显的CR和NLEnter也会被抑制,所以需要手动发送。只需在下一个提示符之前打印一个换行符(终端驱动程序会将其更改为 CR+NL)。

提示还应该转到 stderr 而不是 stdout,后者应该保留用于脚本生成的输出。

#!/bin/bash -
printf>&2 "Enter the db name: "
read -r sourcedb
printf>&2 "Enter the source db username: "
read -r sourceuser
printf>&2 "Enter the source database password: "
IFS= read -rs sourcepwd
printf>&2 "\nEnter the target database username: "
read -r targetuser

read的内置函数(支持抑制回显的 shell )支持自行发出提示(它们发送到 stderr)。与:bashzsh-szsh

read 'var?prompt'

就像在 ksh 和 bash 中一样:

read -p prompt var

printf因此,您可以不使用 ,而是执行以下操作:

#!/bin/bash -
read -rp 'Enter the db name: ' sourcedb
read -rp 'Enter the source db username: ' sourceuser
IFS= read -rsp 'Enter the source database password: ' sourcepwd
read -rp $'\nEnter the target database username: ' targetuser

相关内容