현재 데이터베이스 사용자가 어떤 계정이어야 하는지 결정하는 다음 기능이 있습니다.
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
이는 효과가 있지만 해로울 수 있습니다. 스크립트를 작성할 때 이 추상화 수준으로 이동하지 않는 것이 좋습니다.
앞으로 누가 당신의 대본을 읽을지 생각해 보세요. 다른 소스 코드의 경우에는 프로그래머일 수 있고, 스크립트의 경우에는 작은 수정이나 작은 사용자 정의가 필요한 사용자나 관리자일 수 있습니다. 그것은나 약간의 프로세서 시간을 절약하기 위해(또는 주관적인 코드 냄새를 제거하기 위해) 그들의 시간과 두뇌 능력을 활용하십시오. 키스는이것스크립트 예시.
따라서 루프에서 코드의 주석 처리를 제거하고 "기분 나빠"하지 마십시오.