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
}

これまでのところうまく機能しますが、デフォルトの回答として「はい」を設定したいので、ユーザーが何も入力せずにEnterキーを押すと、「はい」にフォールバックするはずなので、試してみました|| "$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

関数の先頭にデフォルト変数を追加するだけです:

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
}

説明すると、ビルトインは 1 つの条件のみをテストしますが、 withと[[の複数のインスタンスを連鎖させることができます。対照的に、コードは内部で 2 つの条件をテストしようとし、C/C++ の使用法として使用されました。[[&&||[[||

詳細については、help [[またはman bash

于 2013-06-11T15:32:00.847 に答える