如果我使用“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)。与:bash
zsh
-s
zsh
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