
次のような状況があります:
私は、設定ファイル(存在し、パラメータが存在する場合)からパラメータを読み取るか、設定ファイルが存在しない場合はユーザーにそのパラメータの入力を求めるスクリプトを作成しています。
私はいくつかのパラメータに対してこれを実行しているので、関数を記述するのが良い方法だと思いました。
しかし、私が理解している限りでは、関数は結果値をecho
ing するか、グローバル変数に割り当てることによって返します。ただし、関数内で画面にエコーしたいので、オプション 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
。
以下のすべてを実現する方法について、何か提案はありますか?
- どちらかから変数値を取得する
config.cfg
か、ユーザー入力から読み取ります。 - これを一般的な方法で実行します。つまり、各パラメータに対して上記のコード(関数なし)を繰り返さないでください。
答え1
config
100% 理解できているわけではありませんが、ファイルは次のようになっているとします。
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 ...)
それを変数に割り当てることができます。