bash-提示答案



我正在使用以下作为要求用户提供一些输入的基础。

while true; do
    echo "Proceed (y/n)"
    read yn
    case $yn in
        [Nn]*) break;;
        [Yy]*)
            while true; do
                echo "name"
                read name
                echo "id"
                read id
                echo "email"
                read email
                echo "location"
                read -i "south" location
                while true; do
                    echo -e "nIs the above correct ? (y/n)"
                    read res
                    case $res in
                        [Nn]* ) break 1;;
                        [Yy]* )
                            echo -e "nHere we go."
                            break 3;;
                    esac
                done
            done;;
        *) echo "Please answer yes or no.";;
    esac
done

如果他们回答"对上述正确",他们会回到问题的开始。

当前返回开始时,结果默认为空白或默认选项。

谢谢

我将更多地使用-i选项,将read命令的输入预填写先前读取值。用户可以根据需要编辑值。您也可以使用-p选项将其直接添加到read命令中。

location=south
while true; do
    read -p "Proceed (y/n)" yn
    case $yn in
        [Nn]*) break;;
        [Yy]*)
            while true; do
                read -p "Name: " -i "$name" name
                read -p "ID: " -i "$id" id
                read -p "Email: " -i "$email" email
                read -p "Location: " -i "$location" location
                while true; do
                    read -p "Is the above correct ? (y/n)"res
                    case $res in
                        [Nn]* ) break 1;;
                        [Yy]* )
                            echo -e "nHere we go."
                            break 3;;
                    esac
                done
            done;;
        *) echo "Please answer yes or no.";;
    esac
done

如果我了解您要做什么,您想保留并显示用户在选择" no"对"不正确的"之前输入的最后一个值那么,您需要做的就是简单地测试是否已经设置了变量,如果是,则用原始值显示提示

此功能仅适用于第一个用户,但是从那时起,您就负责根据需要使用变量值,然后在开始提示下一个人之前 unsitth 不设置值。您是否正在使用是否为空变量来确定显示"仅提示",并且它填充了变量,您可以显示"带有先前答案的提示"。

有很多方法可以做到这一点。基于您现有脚本的最简单的是:

name=
id=
email=
south=
location=
while true; do
    echo "Proceed (y/n)"
    read yn
    case $yn in
        [Nn]*) break;;
        [Yy]*)
            while true; do
                [ -n "$name" ] && echo "name: $name" || echo "name: "
                read name
                [ -n "$id"] && echo "id: $id" || echo "id: "
                read id
                [ -n "$email" ] && echo "email: $email" || echo "email: "
                read email
                [ -n "$location" ] && echo "location: $location" || echo "location: "
                read -i "south" location
                while true; do
                    echo -e "nIs the above correct ? (y/n)"
                    read res
                    case $res in
                        [Nn]* ) break 1;;
                        [Yy]* )
                            echo -e "nHere we go."
                            ## use vars and then unset for next person
                            break 3;;
                    esac
                done
            done;;
        *) echo "Please answer yes or no.";;
    esac
done

看事物,让我知道我是否正确理解您以及您是否有任何更改。我很乐意进一步帮助。

(主题:我会尝试避免break 3。(
您可以用$ 1编写一个函数readDefault,该变量要显示/读取默认值,而其他参数则作为可选提示。

readDefault() {
   varname=$1
   shift
   if [ $# -eq 0 ]; then
      read -p "${varname} [${!varname}]: " userinput
   else
      read -p "$* [${!varname}]: " userinput
   fi
   printf -v ${varname} "%s" "${userinput:-${!varname}}"
}
# First time defaults outside loop
location="south"
while true; do
    echo "Proceed (y/n)"
    read yn
    case $yn in
        [Nn]*) break;;
        [Yy]*)
            while true; do
                readDefault name "What is your name"
                readDefault id
                readDefault email "Used for sending monthly reports"
                readDefault location
                while true; do
                    echo "Current values: ${name}, ${id}, ${email}, ${location}"
                    echo -e "nIs the above correct ? (y/n)"
                    read res
                    case $res in
                        [Nn]* ) break 1;;
                        [Yy]* )
                            echo -e "nHere we go."
                            break 3;;
                    esac
                done
            done;;
        *) echo "Please answer yes or no.";;
    esac

最新更新