3

我写了一个要求用户输入的函数,如下所示:

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
}

到目前为止效果很好,但是,我想将“是”设置为默认答案,所以当用户什么都不输入并按回车键时,它应该回退到“是”,所以我尝试过,|| "$ans" == ""但仍然回退到“该死”

怎么会?当我echo $ans在函数结束时它是空的......

编辑1:

这就是发生的事情:

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

以下是功能:

function e_ask {
    printf "\n$1\n"
    printf "(Y/n): "
}

function e_warn {
    printf "Warning: $1\n"
}

function e_error {
    printf "Error: $1\n"
    exit 1
}
4

3 回答 3

3

case当您想考虑许多不同的值和默认值时,A更好

功能 is_confirmed {

    读 -rs -k 1 ans

    案例“${ans}”在
    y|Y|$'\n')
        printf "是\n"
            返回 0
        ;;

    *) # 这是默认的
        printf "否\n"
            返回 1

    经社理事会

}
于 2013-06-11T15:29:27.580 回答
3

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

function is_confirmed {

    ans="y"

    echo "Put your choice:"
    read $ans


}

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

于 2014-01-23T13:32:50.603 回答
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
}

解释一下,[[内置函数只测试一个条件,但您可以链接多个[[with&&和实例||。相比之下,您的代码尝试在内部测试 2 个条件[[并将||其用作 C/C++ 用法。

更多详情可在help [[man bash

于 2013-06-11T15:32:00.847 回答