不知何故,我无法将read
尾随\n
符号放入REPLY
变量中。在任何情况下,我都希望避免在另一个字符的情况下仅\n
由一个字符回显而导致出现空行。鉴于:read
echo
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
请注意,由于您不调用read
with IFS=
,因此这也将匹配仅包含空格的输入。
答案3
正如克里斯提到的,它是一个分隔符,但是要检查字符串长度,您可以执行以下操作:
if [ -z "$REPLY" -o "$REPLY" == "y" ]; then
echo "It was acknowledged"
else
echo "Not acknowledged"
exit 1
fi