<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      shell編程技巧——循環邏輯中使用變量引用方式注意事項

      2025-09-02 16:14  瀟湘隱者  閱讀(117)  評論(0)    收藏  舉報

      在shell腳本編程中,因為shell腳本的靈活多變與技巧多樣性, 我們為了腳本的健壯性,我們經常會定義一些規范,例如變量, 我們一般不用$var, 而用"$var"或"${var}"這種變量引用方式,但是往往它們之間的一些細微差別可能讓你的shell腳本產生完全意想不到的的效果. 下面我們通過一個簡單的例子來闡述一下.

      函數check_invalid_obj主要的功能是在各個PDB數據庫中檢查無效對象(INVALID OBJECTS), 其中函數get_pdb_list是獲取PDB數據庫名的列表并賦值給變量$PDB_LIST

      check_invalid_obj() {
      
      get_pdb_list
      
      # 檢查是否獲取到PDB列表
      if [ -z "$PDB_LIST" ]; then
          log_error "錯誤: 未能獲取到PDB列表,請檢查數據庫連接"
          exit ${FAILURE}
      fi
      
      # 在每個PDB中執行SQL語句
      for pdb_name in  "${PDB_LIST}";
      do
          if [ -n "$pdb_name" ]; 
          then
              log_info "正在 $pdb_name 中執行SQL..."
              # 執行SQL語句
              sqlplus -S /nolog <<EOF
                              whenever sqlerror exit sql.sqlcode
                              set serveroutput on;
                              ${CONNECT_INFO}
                              ALTER SESSION SET CONTAINER="$pdb_name";
                              set linesize 720
                              set pagesize 60
                              col object_name for a40
                              col object_type for a15
                              col owner for a10
                              select object_name,object_type,owner,status from dba_objects where status<>'VALID' order by owner,object_name;
                              exit;
      EOF
      
          fi
      done
      
      }
      

      上面這段代碼似乎看著沒有問題,它跟下面這段代碼只有一個地方有細微的區別(循環中變量PDB_LIST的引用方式不同)

      check_invalid_obj() {
      
      get_pdb_list
      
      # 檢查是否獲取到PDB列表
      if [ -z "$PDB_LIST" ]; then
          log_error "錯誤: 未能獲取到PDB列表,請檢查數據庫連接"
          exit ${FAILURE}
      fi
      
      # 在每個PDB中執行SQL語句
      for pdb_name in  ${PDB_LIST};
      do
          if [ -n "$pdb_name" ]; 
          then
              log_info "正在 $pdb_name 中執行SQL..."
              # 執行SQL語句
              sqlplus -S /nolog <<EOF
                              whenever sqlerror exit sql.sqlcode
                              set serveroutput on;
                              ${CONNECT_INFO}
                              ALTER SESSION SET CONTAINER="$pdb_name";
                              set linesize 720
                              set pagesize 60
                              col object_name for a40
                              col object_type for a15
                              col owner for a10
                              select object_name,object_type,owner,status from dba_objects where status<>'VALID' order by owner,object_name;
                              exit;
      EOF
      
          fi
      done
      
      }
      

      如下截圖所示(對比著色部分)

      這兩段代代碼,那一段代碼才能正常運行呢? 答案是下面這一段代碼. 也許只有你自己去調試運行一下,才會明白體會這其中的區別:

      • ${PDB_LIST} 它不保留任何空白或特殊字符,而且分詞(word splitting)只發生在無引號的變量
      • "${PDB_LIST}" 它會保留空白/特殊字符, 變量使用雙引號方式,會將變量的所有值視為一個整體,導致無法分詞(word splitting).

      調試運行這兩段代碼,你就能體會這細微的差別了.具體如下所示(PDB數據庫有PDB1,PDB2兩個):

      錯誤寫法的執行步驟詳細信息:

      ................................................
      + check_invalid_obj
      + get_pdb_list
      ++ sqlplus -S /nolog
      + PDB_LIST='PDB1
      PDB2'
      + '[' -z 'PDB1
      PDB2' ']'
      + for pdb_name in "${PDB_LIST}"
      + '[' -n 'PDB1
      PDB2' ']'
      + log_info '正在 PDB1
      PDB2 中執行SQL...'
      + '[' 1 -eq 1 ']'
      + local 'log_msg=正在 PDB1
      PDB2 中執行SQL...'
      + case $LOG_OUT_TYPE in
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:38:27> 正在 PDB1
      PDB2 中執行SQL...'
      [info]: 20250902 14:38:27> 正在 PDB1
      PDB2 中執行SQL...
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:38:27> 正在 PDB1
      PDB2 中執行SQL...'
      + sqlplus -S /nolog
                              ALTER SESSION SET CONTAINER="PDB1
                                                          *
      ERROR at line 1:
      ORA-65000: missing or invalid pluggable database name
      ........................................................
      

      正確寫法的執行步驟詳細信息:

      + check_invalid_obj
      + get_pdb_list
      ++ sqlplus -S /nolog
      + PDB_LIST='PDB1
      PDB2'
      + '[' -z 'PDB1
      PDB2' ']'
      + for pdb_name in ${PDB_LIST}
      + '[' -n PDB1 ']'
      + log_info '正在 PDB1 中執行SQL...'
      + '[' 1 -eq 1 ']'
      + local 'log_msg=正在 PDB1 中執行SQL...'
      + case $LOG_OUT_TYPE in
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:41:06> 正在 PDB1 中執行SQL...'
      [info]: 20250902 14:41:06> 正在 PDB1 中執行SQL...
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:41:06> 正在 PDB1 中執行SQL...'
      + sqlplus -S /nolog
      
      Session altered.
      
      
      no rows selected
      
      + for pdb_name in ${PDB_LIST}
      + '[' -n PDB2 ']'
      + log_info '正在 PDB2 中執行SQL...'
      + '[' 1 -eq 1 ']'
      + local 'log_msg=正在 PDB2 中執行SQL...'
      + case $LOG_OUT_TYPE in
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:41:06> 正在 PDB2 中執行SQL...'
      ++ date '+%Y%m%d %H:%M:%S'
      + echo -e '[info]: 20250902 14:41:06> 正在 PDB2 中執行SQL...'
      + sqlplus -S /nolog
      [info]: 20250902 14:41:06> 正在 PDB2 中執行SQL...
      
      Session altered.
      
      
      no rows selected
      
      主站蜘蛛池模板: 午夜福利宅福利国产精品| 亚洲日韩国产中文其他| 日本一区二区三区专线| 性做久久久久久久久| 五月婷婷激情视频俺也去淫| 国产一区二区三区小说| 欧洲美熟女乱av在免费| 美女把尿囗扒开让男人添| 日韩亚洲精品中文字幕| 日本深夜福利在线观看| 日本在线a一区视频高清视频| 无码激情亚洲一区| 97欧美精品系列一区二区| 亚洲国产精品综合久久20| 国产精品欧美福利久久| 大方县| 一区二区三区久久精品国产| 亚洲中文字幕一区二区| 日本无遮挡真人祼交视频| 九九热视频在线精品18| 亚洲人成电影网站 久久影视| 国产盗摄xxxx视频xxxx| 在线观看免费人成视频色| 精品无码国产日韩制服丝袜| 精品人妻免费看一区二区三区| 熟妇人妻久久精品一区二区| 曰韩无码二三区中文字幕| 日日爽日日操| 亚洲男人精品青春的天堂| 男女性杂交内射女bbwxz| 亚洲性日韩精品一区二区| 依依成人精品视频在线观看| 盘山县| 国产精品亚洲二区在线看| 无码国产偷倩在线播放| 久久精品国产久精国产| 国产成人精品亚洲一区二区| 欧美成人影院亚洲综合图| 一区二区三区激情免费视频| 精品视频在线观看免费观看| 人妻中文字幕亚洲一区|