zsh - 使用默认值读取用户输入 - 空输入不为空?

时间:2013-06-11 15:24:08

标签: macos bash shell zsh ksh

我写了一个函数,询问用户输入如下:

function is_confirmed {

    read -rs -k 1 ans

    if [[ "${ans}" == "n" || "${ans}" == "N" ]]; then
        printf "No\n"
        return 1
    fi

    if [[ "${ans}" == "y" || "${ans}" == "Y" ]]; then
        printf "Yes\n"
        return 0
    fi

    # here is my actual problem!!! this doesnt work when user input is blank!
    if [[ "${ans}" == "" ]]; then
        printf "Yes!\n"
        return 1
    fi

    # Output is Damn!
    printf "Damn"
    return 1
}

到目前为止工作得很好,但是,我想将“yes”设置为默认的answear,所以当用户没有输入任何东西并按下回车时,它应该回到“是”,所以我尝试用{{1但那仍然会回到“该死的”

怎么来的?当我在函数末尾|| "$ans" == ""时它是空的......

编辑1:

这就是:

echo $ans

这是功能:

e_ask "Are you sure you want to install?\nWarning: This may override some files in your home directory."

if is_confirmed; then
    echo "Great!"
else
    e_error "Aborting..."
fi

3 个答案:

答案 0 :(得分:1)

当您想要考虑许多不同的值和默认值

时,case会更好
function is_confirmed {

    read -rs -k 1 ans

    case "${ans}" in
    y|Y|$'\n')
        printf "Yes\n"
            return 0
        ;;

    *)  # This is the default
        printf "No\n"
            return 1

    esac

}

答案 1 :(得分:1)

问题在于您如何使用[[内置编写条件。

您需要将条件更改为:

function is_confirmed {

    read -rs -k 1 ans

    if [[ "${ans}" == "n" ]] || [[ "${ans}" == "N" ]]; then
        printf "No\n"
        return 1
    else if [[ "${ans}" == "y" ]] || [[ "${ans}" == "Y" ]]; then
        printf "Yes\n"
        return 0
    else if [[ -z "${ans}" ]]; then
        printf "Empty\n"
    else
        printf "Damn\n"
    fi

    return 1
}

要解释一下,[[内置版只测试一个条件,但您可以将[[的多个实例与&&||链接起来。相反,您的代码尝试在[[内测试2个条件,并使用||作为C / C ++用法。

help [[man bash

中提供了更多详细信息

答案 2 :(得分:1)

只需在函数开头添加默认变量:

function is_confirmed {

    ans="y"

    echo "Put your choice:"
    read $ans


}

如果未输入任何内容,则默认值将保留。