我正在使用以下作为要求用户提供一些输入的基础。
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