Shell脚本,在打印消息后读取同一行的内容

56

我正在执行以下shell脚本

#!/bin/sh

echo "Enter [y/n] : "
read opt

它的输出为

Enter [y/n] : 
Y

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

Enter [y/n] : Y

我猜应该很简单,但我对Bash脚本编写还很陌生。


感谢您格式化帖子。这是我的第一篇帖子。我会确保我的其他帖子有良好的格式。 - user1263746
4个回答

71

解决方案:read -p "输入[y/n]:" opt

来自help read

  -p prompt output the string PROMPT without a trailing newline before
        attempting to read

59

在脚本的开头添加#!/bin/sh这一行,意味着你正在编写可以在历史悠久的 Bourne shell (仍然存在于某些系统上,如 Solaris)或者更可能的,由 POSIX 定义的标准 shell 语言中运行的代码。这意味着read -pecho -n都不可靠。

标准/便携解决方案是:

printf 'Enter [y/n] : '
read -r opt

(-r选项避免了特殊字符\的处理,因为通常情况下read会将它作为行尾续行符处理。)

如果你知道你的脚本将在安装有Bash的系统上运行,你可以将shebang更改为#!/bin/bash(或#!/usr/bin/env bash),并使用所有高级的Bash功能。(许多系统将/bin/sh链接到bash以便两种方法都可以工作,但依赖此方式是不好的实践方法,且当以sh名称执行时,bash实际上会禁用一些自己的功能。)


2
这是一个非常好而且非常清晰的解释。顺便说一下,我用的是 RHEL 5.5。 - user1263746

15
echo -n "Enter [y/n] : " ; read opt

或者!(晚点做更好)

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

4

在echo命令中使用“-n”句柄,这将避免输出末尾的换行符。

echo -n "Enter [y/n] : "
read opt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接