iT邦幫忙

0

請問bash高手,如何不用暫存檔而做到相同的功能?

小弟有一些bash script
先撈取資料,轉存入暫存檔內
再讀取該暫存檔,進行逐筆處理。
範例如下

#! /bin/bash
ls -l /var/log/messages* > temp # 資料結果轉入暫存檔
exec < temp # 將檔案讀進標準輸入
while read rec
do
echo $rec # 進行處理
done

日子久了,長出一堆亂七八糟的檔案。
想請問一下
如何改寫上面的script
能夠不使用暫存檔,而達到同樣的功能?

看更多先前的討論...收起先前的討論...
dragonH iT邦超人 5 級 ‧ 2019-09-05 10:17:47 檢舉
用完再刪掉不可行嗎
存在/tmp資料夾裡,每次重開機都會自動被清除,這樣不可以嗎?
我自已在處理一些需要變數轉換的暫存執行用檔。也是運行完了就rm掉了。並不會出現有的沒有的東西出來。
kjfang iT邦新手 5 級 ‧ 2019-09-05 14:19:59 檢舉
dragonH 大 & 浩瀚星空 大
我知道養成好習慣的重要
但有時候在老闆催促下
匆忙處理完資料就忘了
時間一久,就....

japhenchen 大
若大家都統一集中放在一個地方
就比較容易處理了
此外,原則上公司 Server 是7*24不關機的....
man tempfile
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
DanSnow
iT邦好手 1 級 ‧ 2019-09-05 10:52:32
最佳解答

可以像這樣用 <<< 直接把字串輸入另一個指令,字串中的 $() 則是取其中的指令執行的結果,然後轉成字串

while read rec; do
    echo $rec # 進行處理
done <<< "$(ls -l /var/log/messages*)"

或是你也可以修改 IFS

old_ifs="$IFS" # 備份 IFS ,如果有需要的話
IFS=$'\n'
for rec in $(ls -l  /var/log/messages*); do
  echo $rec # 進行處理
done

IFS="$old_ifs" # 還原 IFS

kjfang iT邦新手 5 級 ‧ 2019-09-05 14:37:15 檢舉

DanSnow 大
真是太感謝您了。
經測試後,兩個方法都可行。
我模仿檔案輸入的模式
用過許多方法,想把資料導進標準輸入
都出現EOF的問題。
卻從沒想過像您這樣
揚棄標準輸入,直接把資料導進迴圈中。

1
Ray
iT邦大神 1 級 ‧ 2019-09-05 10:29:17

這樣不行嗎?

ls -l /var/log/messages* | exec
while read rec
do
echo $rec # 進行處理
done
kjfang iT邦新手 5 級 ‧ 2019-09-05 14:35:50 檢舉

您的方法我測試過了。
除了從檔案匯入之外
凡是想把資料導入標準輸入,然後再讀取的
都遇到類似的問題:
標準輸入在等待EOF(或是說,沒有EOF)

我要發表回答

立即登入回答