Shell脚本,在回显消息后在同一行读取

use*_*746 32 linux bash shell

按照我正在执行的shell脚本

#!/bin/sh

echo "Enter [y/n] : "
read opt
Run Code Online (Sandbox Code Playgroud)

它的输出是

Enter [y/n] : 
Y
Run Code Online (Sandbox Code Playgroud)

我希望变量应该在同一行上读取,如下所示

Enter [y/n] : Y
Run Code Online (Sandbox Code Playgroud)

应该很简单我猜,但我是bash脚本的新手.

Ign*_*ams 42

解: read -p "Enter [y/n] : " opt

来自help read:

  -p prompt output the string PROMPT without a trailing newline before
        attempting to read
Run Code Online (Sandbox Code Playgroud)


Tay*_*nUB 38

shebang #!/bin/sh意味着您正在为历史Bourne shell编写代码(在我认为的某些系统上仍然可以找到),或者更有可能是POSIX定义的标准shell语言.这意味着read -p并且echo -n都不可靠.

标准/便携式解决方案是:

printf 'Enter [y/n] : '
read -r opt
Run Code Online (Sandbox Code Playgroud)

(-r防止特殊处理\,因为read通常在行尾处接受它作为行继续.)

如果您知道您的脚本将在具有Bash的系统上运行,则可以将shebang更改为#!/bin/bash(或#!/usr/bin/env bash)并使用所有花哨的Bash功能.(许多系统都有/bin/sh符号链接,bash因此它可以正常工作,但依赖于这是不好的做法,并且bash在名称下执行时实际上会禁用它自己的一些功能sh.)

  • 这是一个很棒且非常清晰的解释。顺便说一句,我使用的是 RHEL 5.5。 (2认同)

hel*_*ldt 8

echo -n "Enter [y/n] : " ; read opt
Run Code Online (Sandbox Code Playgroud)

要么!(后来更好)

read -p "[y/n]: " opt
Run Code Online (Sandbox Code Playgroud)