
私は次のような状況にあります。
構成ファイルからそのパラメーターを読み取り(存在し、パラメーターが存在する場合)、ユーザーにそのパラメーターを入力するように要求する(存在しない場合)スクリプトを作成しています。
いくつかのパラメータに対してこれをやっているので、関数を書くのが良い方法だと思いました。
しかし、私が理解しているように、関数はecho
結果の値をグローバル変数に割り当てるか割り当てて返します。関数から画面をエコーしたいので、オプション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
ファイルconfig.cfg
はsource
関数を呼び出す前に生成され、オプションの$database_username
パラメータの1つです。
今これは明らかに動作しません。私は割り当てることができず、$3
メソッドが一般的であることを望むので、MY_VARIABLE=$parameter
そうすることもできません。
以下をすべて達成する方法について提案がある人はいますか?
- 変数の値を取得するか、
config.cfg
ユーザー入力から読み込みます。 - 一般的な方法でこれを行います。つまり、各パラメータに対して上記のコードを繰り返さないでください(関数なし)。
答え1
100%確信できませんが、ファイルがconfig
次のようになるとします。
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 ...)
変数に割り当てることができます。