read
何らかの形で末尾の記号を変数\n
に入れることはできません。いずれにせよ、他の文字がない場合は、1文字だけをエコーして空白行が発生するのを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に表示されます。 NULL は$REPLY
単に NUL( <Ctrl-Space>
)、EOF、またはエラーを意味します(どちらの場合も、終了ステータスはゼロではありません)。
答え2
Readは\n
レコード区切り文字として使用されるため、で終わりません$REPLY
。echo
確認したい場合は。ただ行(つまり、空行)に改行文字がある場合、次のテストのいずれかが機能します。
[[ $REPLY == "" ]] # true if line is empty
(( ${#REPLY} )) # true if line is not empty
read
を使用して呼び出さないため、IFS=
スペースのみを含む入力と一致します。
答え3
Chrisが述べたように、区切り文字ですが、文字列の長さを確認するには、次のようにします。
if [ -z "$REPLY" -o "$REPLY" == "y" ]; then
echo "It was acknowledged"
else
echo "Not acknowledged"
exit 1
fi