如何使用 Bash 的内置命令将 '\n' 读入变量?

如何使用 Bash 的内置命令将 '\n' 读入变量?

不知何故,我无法将read尾随\n符号放入REPLY变量中。在任何情况下,我都希望避免在另一个字符的情况下仅\n由一个字符回显而导致出现空行。鉴于:readecho

declare -l REPLY
read >&2 -r -N 1 -p "Acknowledged? (y):" REPLY
if [[ "$REPLY" != $'\n' ]]; then
  echo >&2
fi

对我来说,一个可能的解决方法是read抑制 ( -s) 回显输入。但理想情况下,用户应该在提示后看到他输入的单个字符。

也不IFS= read -d''能让我将\n字符放入变量中。

有任何想法吗?

答案1

FWIW,你的代码对我有用。

$ echo | bash -c 'read -rN1; echo "$BASH_VERSION <$REPLY>"'
4.2.36(1)-release <
>

使用-N,无需设置IFS,并且 NL 最终会出现在 $REPLY 中。空$REPLY仅意味着 NUL ( <Ctrl-Space>) 或 EOF 或错误(尽管对于这两个而言,退出状态将为非零)

答案2

Read 使用\n作为其记录分隔符,因此它永远不会在$REPLY.您看到的换行符是由于echo.如果您想检查仅有的一行上的换行符(即空行),以下测试之一将起作用:

[[ $REPLY == "" ]] # true if line is empty
(( ${#REPLY} )) # true if line is not empty

请注意,由于您不调用readwith IFS=,因此这也将匹配仅包含空格的输入。

答案3

正如克里斯提到的,它是一个分隔符,但是要检查字符串长度,您可以执行以下操作:

if [ -z "$REPLY" -o "$REPLY" == "y" ]; then
    echo "It was acknowledged"
else
    echo "Not acknowledged"
    exit 1
fi

相关内容