關於while read line 循環中變量作用域的問題
阿新 • • 發佈:2018-10-24
作用 完成 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 循環中變量作用域的問題