現在、データベースユーザーがどのアカウントであるべきかを決定するための次の機能があります。
calc_id_value(){
case $id_opt in
"") id_value="$script_id@$SID"
sql_in_db=$id_value
;;
sys) id_value="sys/$sys_password@$SID as sysdba"
sql_in_db=$id_value
;;
system) id_value="system/$system_password@$SID"
sql_in_db=$id_value
;;
*) echo "Error in calc_id_value()"
;;
esac
}
後でリストの各行を読んでみましょう。各行はデータベースです。以下のループは各データベースに移動してsql_in
ログインするだけでファイルを実行する関数を実行します。問題は、次のデータベースに進まないことです。 =でなければなりませんが、$id_value
=を=と解釈するためです。$script_id@$database1
$script_id@databasen
while read sid
do
SID=$sid
export SID
# calc_id_value
sql_in_db=$id_value
sql_in
done < "$list_value"
問題は、次のデータベースに進まないことです。 =でなければ=を解釈し続けるからです$id_value
。$script_id@$database1
$script_id@databasen
calc_id_value
ただし、ループ内でコメントを削除すると機能します。これを許可すると、悪いプログラミングの習慣のように感じます。次に、現在のループ反復がcase
その宣言に戻るように強制します。もっと良い方法がありますか?可能であれば、各行を読んだ後に変数$SID
の一部を動的に変更できることを願っていますid_value
。
答え1
これは効果がありますが、有害かもしれません。スクリプトを作成するときは、この抽象化レベルに移動しないことをお勧めします。
今後誰があなたの台本を読むのか考えてみましょう。他のソースコードの場合はプログラマであり、スクリプトの場合は小さな変更や小さなカスタマイズが必要なユーザーまたは管理者です。それ私 わずかなプロセッサ時間を節約するために(または主観的なコードの臭いを取り除くために)彼らの時間と脳の能力を活用してください。キスはこれスクリプトの例。
したがって、ループ内のコードのコメントを削除し、「気分が悪く」しないでください。