确认 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