2

ユーザーに値の確認を発行してもらいたい構成変数が多数あります。そのため、実行番号を指定する変数が存在する可能性があり、スクリプトでユーザーに変数の現在の値が問題ないかどうかを尋ねます。ユーザーが値に問題があると応答すると、スクリプトは新しい値を要求し、それを変数に割り当てます。

これを行うための関数を最初に試みましたが、実行に問題があります。それは失速します。問題を解決するための支援と、私が使用しているアプローチに対する批判を歓迎します。コードは次のとおりです。

confirmVariableValue(){
    variableName="${1}"
    variableValue="${!variableName}"
    while [[ "${userInput}" != "n" && "${userInput}" != "y" ]]; do
        echo "variable "${variableName}" value: "${variableValue}""
        echo "Is this correct? (y: continue / n: change it / other: exit)"
        read userInput
        # Make the user input lowercase.
        userInput="$(echo "${userInput}" | sed 's/\(.*\)/\L\1/')"
        # If the user input is "n", request a new value for the variable. If the
        # user input is anything other than "y" or "n", exit. If the user input
        # is "y", then the user confirmation loop ends.
        if [[ "${userInput}" == "n" ]]; then
            echo "enter variable "${variableName}" value:"
            read variableValue
        elif [[ "${userInput}" != "y" && "${userInput}" != "n" ]]; then
            echo "terminating"
            exit 0
        fi
    done
    echo "${variableValue}"
}

myVariable="run_2014-09-23T1909"
echo "--------------------------------------------------------------------------------"
echo "initial variable value: "${myVariable}""
myVariable="$(confirmVariableValue "myVariable")"
echo "final variable value: "${myVariable}""
echo "--------------------------------------------------------------------------------"
4

2 に答える 2

1

「はい」と答えてから新しい値を入力することはありません。必要に応じて新しい値を入力するか、空白のままにしてデフォルトを受け入れます。

この小さな関数を使用すると、1 回の呼び出しで複数の変数を設定できます。

function confirm() {
    echo "Confirming values for several variables."

    for var; do
        read -p "$var = ${!var} ... leave blank to accept or enter a new value: "
        case $REPLY in
        "") # empty use default
            ;;
        *) # not empty, set the variable using printf -v
            printf -v "$var" "$REPLY"
            ;;
        esac
    done
}

次のように使用します。

$ foo='foo_default_value'
$ bar='default_for_bar'
$ confirm foo bar
Confirming values for several variables.

foo = foo_default_value ... leave blank to accept or enter a new value: bar
bar = default_for_bar ... leave blank to accept or enter a new value:

foo=[bar], bar=[default_for_bar]

もちろん、空白をデフォルトにすることができる場合は、@ jm666 の使用のように、それを考慮する必要がありますread -i

于 2014-09-23T18:42:36.427 に答える