我正在执行以下shell脚本
#!/bin/sh
echo "Enter [y/n] : "
read opt
它的输出为
Enter [y/n] :
Y
我希望变量应该在同一行上读取,如下所示。
Enter [y/n] : Y
我猜应该很简单,但我对Bash脚本编写还很陌生。
解决方案:read -p "输入[y/n]:" opt
来自help read
:
-p prompt output the string PROMPT without a trailing newline before
attempting to read
在脚本的开头添加#!/bin/sh
这一行,意味着你正在编写可以在历史悠久的 Bourne shell (仍然存在于某些系统上,如 Solaris)或者更可能的,由 POSIX 定义的标准 shell 语言中运行的代码。这意味着read -p
和echo -n
都不可靠。
标准/便携解决方案是:
printf 'Enter [y/n] : '
read -r opt
(-r
选项避免了特殊字符\
的处理,因为通常情况下read
会将它作为行尾续行符处理。)
如果你知道你的脚本将在安装有Bash的系统上运行,你可以将shebang更改为#!/bin/bash
(或#!/usr/bin/env bash
),并使用所有高级的Bash功能。(许多系统将/bin/sh
链接到bash
以便两种方法都可以工作,但依赖此方式是不好的实践方法,且当以sh
名称执行时,bash
实际上会禁用一些自己的功能。)
echo -n "Enter [y/n] : " ; read opt
或者!(晚点做更好)
read -p "[y/n]: " opt
在echo命令中使用“-n”句柄,这将避免输出末尾的换行符。
echo -n "Enter [y/n] : "
read opt