他の変数値の一部である変数を変更する方法

他の変数値の一部である変数を変更する方法

現在、データベースユーザーがどのアカウントであるべきかを決定するための次の機能があります。

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

これは効果がありますが、有害かもしれません。スクリプトを作成するときは、この抽象化レベルに移動しないことをお勧めします。

今後誰があなたの台本を読むのか考えてみましょう。他のソースコードの場合はプログラマであり、スクリプトの場合は小さな変更や小さなカスタマイズが必要なユーザーまたは管理者です。それ わずかなプロセッサ時間を節約するために(または主観的なコードの臭いを取り除くために)彼らの時間と脳の能力を活用してください。キスはこれスクリプトの例。

したがって、ループ内のコードのコメントを削除し、「気分が悪く」しないでください。

関連情報