要获得用户的[Y/N]
决定,我正在使用" Yesno"函数,其中包含一个循环:
answer=$( while ! head -c 1 | grep -i '[ny]' ; do true ; done )
但是,此循环正在阻止控制台,无法通过按 ctrl c 或 ctrl> ctrl z 添加诸如 [x03]
( ctrl c (或 [x1A]
(accii for ctrl z z (之类的东西不也可以帮助。如何添加此功能,同时保留POSIX兼容性并且不依赖其他工具?
#!/bin/sh
yesno () {
printf "$1 [Y/N] "
old_stty_cfg=$( stty -g )
stty raw -echo
answer=$( while ! head -c 1 | grep -i '[ny]' ; do true ; done )
stty "$old_stty_cfg"
if printf "$answer" | grep -iq "^y" ; then
return 0
else
return 1
fi
}
if yesno "Question?" ; then
printf "yesn"
return 0
else
printf "non"
return 1
fi
有关此解决方案及其'posix兼容性的评论 - 将非常感谢!
#!/bin/sh
enter=$( printf ' 15' )
ctrl_c=$( printf ' 03' )
ctrl_x=$( printf ' 30' )
ctrl_z=$( printf ' 32' )
yesno () {
printf '%b [Y/N] ' "$1"
old_stty_cfg=$( stty -g )
stty raw -echo
while true ; do
answer=$( head -c 1 )
case $answer in *"$ctrl_c"*|"$ctrl_x"*|"$ctrl_z"*)
stty "$old_stty_cfg"
exit 1
;;
*"y"*|"Y"*)
stty "$old_stty_cfg"
return 0
;;
*"n"*|"N"*)
stty "$old_stty_cfg"
return 1
;;
esac
done
}
if yesno "Question?" ; then
printf "yesn"
exit 0
else
printf "non"
exit 1
fi