在" answer=$( while ! head -c 1 | grep -i '[ny]' ; do true ; done ) "时支持 Ctrl+C / Ctrl+Z



要获得用户的[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

最新更新