亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Shell腳本讀取最后一行丟失

Shell腳本讀取最后一行丟失

慕尼黑8549860 2019-11-25 20:16:13
Shell腳本讀取最后一行丟失我有一個... bash shell腳本的奇怪問題,我希望得到一些見解。我的團隊正在編寫一個腳本,該腳本遍歷文件中的行并檢查每個行中的內容。我們有一個錯誤,當通過將不同腳本排序在一起的自動化過程運行時,最后一行沒有被看到。使用的代碼遍歷文件中的行(名稱存儲在DATAFILE被cat "$DATAFILE" | while read line我們可以從命令行運行腳本,它會看到文件中的每一行,包括最后一行,就好了。但是,當由自動化進程(運行在相關腳本之前生成DATAFILE的腳本)運行時,永遠不會看到最后一行。我們更新了代碼以使用以下代碼迭代這些行,并清除了問題:for line in `cat "$DATAFILE"`注意:DATAFILE沒有在文件末尾寫入換行符。我的問題是兩部分......為什么最后一行不會被原始代碼看到,為什么這會改變有所作為呢?我只想到我能想出為什么最后一行不會被看到:前一個寫入文件的進程依賴于進程結束以關閉文件描述符。問題腳本正在啟動并以足夠快的速度打開文件,而前一個進程已“結束”,它沒有“關閉/清理”足以讓系統自動關閉文件描述符。話雖這么說,似乎,如果你在shell腳本中有2個命令,那么第一個應該在腳本運行第二個時完全關閉。對問題的任何見解,尤其是第一個,都將非常感激。
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

根據read命令POSIX規范,如果“檢測到文件結尾或發生錯誤”,它應返回非零狀態。由于在讀取最后一行“EOF”時檢測到EOF,因此它會設置$line然后返回錯誤狀態,并且錯誤狀態會阻止循環在最后一行“行”上執行。解決方案很簡單:如果讀取命令成功或者讀入任何內容,則執行循環$line

while read line || [ -n "$line" ]; do


查看完整回答
反對 回復 2019-11-26
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

添加一些額外信息:

  1. 沒有必要使用catwhile循環。while ...;do something;done<file足夠。

  2. 不要讀行for。

使用while循環讀取行時:

  1. 設置IFS正確(否則可能會丟失縮進)。

  2. 您應該幾乎總是將-r選項與read一起使用。

滿足上述要求時,正確的while循環將如下所示:

while IFS= read -r line; do
  ...done <file

并使其在沒有換行符的情況下使用文件(從此處重新發布我的解決方案):

while IFS= read -r line || [ -n "$line" ]; do
  echo "$line"done <file

或者使用grepwhile循環:

while IFS= read -r line; do
  echo "$line"done < <(grep "" file)



查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 880 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號