Bash関数は渡されたパラメータに値を割り当てます

Bash関数は渡されたパラメータに値を割り当てます

次のような状況があります:

私は、設定ファイル(存在し、パラメータが存在する場合)からパラメータを読み取るか、設定ファイルが存在しない場合はユーザーにそのパラメータの入力を求めるスクリプトを作成しています。

私はいくつかのパラメータに対してこれを実行しているので、関数を記述するのが良い方法だと思いました。

しかし、私が理解している限りでは、関数は結果値をechoing するか、グローバル変数に割り当てることによって返します。ただし、関数内で画面にエコーしたいので、オプション 2 を使用する必要があります。そこで、次のことを試しました。

# parameters: $1=name of parameter, $2=user prompt, $3=value read from config.cfg
function getParameter {
    # If the value couldn't be read from the config file
    if [ -z "$3" ]; then
        # Echo the prompt
        echo "$2"
        # Read the user input
        read parameter

        # If it's empty, fail
        if [ -z "$parameter" ]; then
            echo "Parameter $1 not found"
            exit
        # Else, try to assign it to $3   <---- This is where it fails
        else
            $3="$parameter"
        fi
    fi
}

私はこう呼んでいます:

getParameter "Database username" "Please enter database username" $database_username

ファイルは関数が呼び出される前に dconfig.cfgされ、オプションのパラメータの 1 つです。source$database_username

これは明らかに機能しません。割り当てることができず$3、メソッドをジェネリックにしたいので、どちらもできませんMY_VARIABLE=$parameter

以下のすべてを実現する方法について、何か提案はありますか?

  1. どちらかから変数値を取得するconfig.cfgか、ユーザー入力から読み取ります。
  2. これを一般的な方法で実行します。つまり、各パラメータに対して上記のコード(関数なし)を繰り返さないでください。

答え1

config100% 理解できているわけではありませんが、ファイルは次のようになっているとします。

foo
database_user tom
bar

私たちが望む明白な値は ですdatabase_user

スクリプトでは、次のような行を追加するだけです。

dbUser=$(sed -nE 's/database_user (.*$)/\1/p' config)

すると、変数には$dbUser次の情報が含まれます。

echo $dbUser 
tom

答え2

よし、自分の問題は解決したようだ:

function getParameter {
    if [ -z "$3" ]; then
        # User read -p to show a prompt rather than using echo for this
        read -p "$2`echo $'\n> '`" parameter

        # Print to sdterr and return 1 to indicate failure
        if [ -z "$parameter" ]; then
            >&2 echo "Parameter $1 not found"
            return 1
        else
            echo $parameter
        fi
    else
        echo $3
    fi
}

を使用することで、echo -pコンソールにプロンプ​​トを表示し、通常の を使用して関数から文字列を返すことができましたecho。このようにして、関数を で呼び出すことで、database_username=$(getParameter ...)それを変数に割り当てることができます。

関連情報