确认 Shell 脚本输入
Confirming Shell Script Input
我正在编写一个脚本来执行重复性任务,该任务仅更改基本值和位置(例如用户名)。
我已经编写了提示输入用户名并验证它尚未被使用的代码。我现在正试图提示用户脚本收到的输入是否正确以及是否不更改它。我的问题是,如果输入正确,它会一直循环。有人有什么建议吗?
clear
confirm () {
# call with a prompt string or use a default
echo "CMIT # "
read -r -p "CMIT [Y/n/q] > " answer
case "${answer}" in
[yY]|[yY][eE][sS]) false ;;
[nN]|[nN][oO]) true ;;
[qQ]|[qQ][uU][iI][tT]) exit 1 ;;
esac
}
while true; do
OE_USER=
while (id -u $OE_USER > /dev/null 2>&1); do
echo "CMIT # What user will this run under?"
read -r -p "CMIT > " OE_USER
if id -u $OE_USER > /dev/null 2>&1; then
echo "CMIT # Bad User Name. Try Again"
fi
done
clear
confirm "Continue installing using '$OE_USER' as the server name?"
done
clear
GO=true
confirm () {
# call with a prompt string or use a default
echo "CMIT # "
read -r -p "CMIT [Y/n/q] > " answer
case "${answer}" in
[yY]|[yY][eE][sS]) GO=false ;;
[nN]|[nN][oO]) GO=true ;;
[qQ]|[qQ][uU][iI][tT]) exit 1 ;;
esac
}
while $GO; do
OE_USER=
while (id -u $OE_USER > /dev/null 2>&1); do
echo "CMIT # What user will this run under?"
read -r -p "CMIT > " OE_USER
if id -u $OE_USER > /dev/null 2>&1; then
echo "CMIT # Bad User Name. Try Again"
fi
done
clear
confirm "Continue installing using '$OE_USER' as the server name?"
done
GO=true
您可以声明一个全局标志,在确认函数内设置一个好的答案,或者您可以在确认内使用 return 语句,在 while 循环的条件中进行测试。
还有其他选项,例如在测试用户输入后使用递归调用。这将不需要 while 循环,但也需要使您的初始输入成为一个函数。
您可以使用函数的退出状态:
将"yes"的情况改为执行"true",将"no"的情况改为执行"false"。那么
while true; do
# ...
if confirm "Continue installing using '$OE_USER' as the server name?"
then
break
fi
done
我正在编写一个脚本来执行重复性任务,该任务仅更改基本值和位置(例如用户名)。
我已经编写了提示输入用户名并验证它尚未被使用的代码。我现在正试图提示用户脚本收到的输入是否正确以及是否不更改它。我的问题是,如果输入正确,它会一直循环。有人有什么建议吗?
clear
confirm () {
# call with a prompt string or use a default
echo "CMIT # "
read -r -p "CMIT [Y/n/q] > " answer
case "${answer}" in
[yY]|[yY][eE][sS]) false ;;
[nN]|[nN][oO]) true ;;
[qQ]|[qQ][uU][iI][tT]) exit 1 ;;
esac
}
while true; do
OE_USER=
while (id -u $OE_USER > /dev/null 2>&1); do
echo "CMIT # What user will this run under?"
read -r -p "CMIT > " OE_USER
if id -u $OE_USER > /dev/null 2>&1; then
echo "CMIT # Bad User Name. Try Again"
fi
done
clear
confirm "Continue installing using '$OE_USER' as the server name?"
done
clear
GO=true
confirm () {
# call with a prompt string or use a default
echo "CMIT # "
read -r -p "CMIT [Y/n/q] > " answer
case "${answer}" in
[yY]|[yY][eE][sS]) GO=false ;;
[nN]|[nN][oO]) GO=true ;;
[qQ]|[qQ][uU][iI][tT]) exit 1 ;;
esac
}
while $GO; do
OE_USER=
while (id -u $OE_USER > /dev/null 2>&1); do
echo "CMIT # What user will this run under?"
read -r -p "CMIT > " OE_USER
if id -u $OE_USER > /dev/null 2>&1; then
echo "CMIT # Bad User Name. Try Again"
fi
done
clear
confirm "Continue installing using '$OE_USER' as the server name?"
done
GO=true
您可以声明一个全局标志,在确认函数内设置一个好的答案,或者您可以在确认内使用 return 语句,在 while 循环的条件中进行测试。
还有其他选项,例如在测试用户输入后使用递归调用。这将不需要 while 循环,但也需要使您的初始输入成为一个函数。
您可以使用函数的退出状态:
将"yes"的情况改为执行"true",将"no"的情况改为执行"false"。那么
while true; do
# ...
if confirm "Continue installing using '$OE_USER' as the server name?"
then
break
fi
done