다른 변수 값의 일부인 변수를 변경하는 방법

다른 변수 값의 일부인 변수를 변경하는 방법

현재 데이터베이스 사용자가 어떤 계정이어야 하는지 결정하는 다음 기능이 있습니다.

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

이는 효과가 있지만 해로울 수 있습니다. 스크립트를 작성할 때 이 추상화 수준으로 이동하지 않는 것이 좋습니다.

앞으로 누가 당신의 대본을 읽을지 생각해 보세요. 다른 소스 코드의 경우에는 프로그래머일 수 있고, 스크립트의 경우에는 작은 수정이나 작은 사용자 정의가 필요한 사용자나 관리자일 수 있습니다. 그것은 약간의 프로세서 시간을 절약하기 위해(또는 주관적인 코드 냄새를 제거하기 위해) 그들의 시간과 두뇌 능력을 활용하십시오. 키스는이것스크립트 예시.

따라서 루프에서 코드의 주석 처리를 제거하고 "기분 나빠"하지 마십시오.

관련 정보