1. 程式人生 > >關於while read line 循環中變量作用域的問題

關於while read line 循環中變量作用域的問題

作用 完成 nbsp 默認 使用 從數據 sql 語句 發生 文件

前一陣用shell寫了一個從數據庫中抽取數據生成.xml文件的腳本,要求是每個文件中只生成1000條數據。於是用到了while read line 作為循環。

在制作文件計數器的時候發現了一個問題,在執行的過程中文件計數器(FILENUM)總是出現返回初始值的現象,具體簡化的腳本如下:

#/bin/bash
FILENUM=1
for i in (多個表)
do
  #sql 語句 > .swap
  COUNTER=0
  cat .swap | while
read line   do
    #變量賦值以及寫入文件的內容(不是重點,沒細寫)
    COUNTER=$[COUNTER+1]
    if [ $COUNTER -eq 1000 ]
    then
      #封包操作,封包的包名中附帶了$FILENAME(沒細寫)
      FILENUM=$[FILENUM+1]
    fi   done
  #封包操作,封包的包名中附帶了$FILENAME,因為不能保證是1000條整數,所以read line跳出後還是需要執行這個操作。
  FILENUM=$[FILENUM+1]
done

基本流程如上:

在執行過程中發現文件計數器FILENUM總是有還原成默認值的情況。

經過調試發現,每一次while read line 循環的文件完成之後都會發生這種現象。

啟動sh的時候同時也發現了兩個同名的*.sh進程

經過查閱資料,發現在while read line 的用法中常用的有兩種。

cat FILE | while read line
do
    
done
while read line
do

done < FILE

經過分別測試得出以下結論:

使用管道符 | 的方法相當於啟動了一個獨立的子進程,因此循環中的變量FILENUM是屬於自進程中的,與循環外的FILENUM雖然同名,但是值卻不同。

使用重定向 < 的方法則不會有這種現象,在腳本啟動時並沒有子進程出現,因此循環內部變量FILENUM與循環外的FILENUM變量在同一個bash shell中。

關於while read line 循環中變量作用域的問題