我有未知數量的日志/文本檔案,我需要使用 Bash 腳本從中讀取并匯總其中的一些變數。問題是我的變數在回圈中的每次迭代后重置。我看到了類似的問題,但檔案數量有限(只有兩個檔案)。
我設法用 ls 找到檔案的數量。我使用 cat 從每個檔案中讀取。我無法正確保存和添加變數。這就是我嘗試做的事情:
logfiles=($(ls -l ~ | grep -o '[^ ] $' | grep ${LOG_NAME}log))
num_of_logs=${#logfiles[@]}
for LOG_NUM in `seq 0 $(($num_of_logs-1))`
do (
SPEED=`cat $LOG | grep sum_sent -A7 | grep bits_per_second | tr "," " " | awk '{ SUM =$NF } END { print SUM } '`
BITS=$(printf '%.0f' ${SPEED})
GIGABITS=$( bc -l <<< "scale=2; $BITS/1000000000" )
GIGASUM=$( echo "$GIGABITS $GIGASUM" | bc )
)
done `
嘗試過:將“cat”命令分隔成一個帶有陣列的單獨回圈,并將每個結果輸入到不同的索引中。產生了相同的結果,并且陣列也為空。
uj5u.com熱心網友回復:
問題是我的變數在回圈中的每次迭代后重置。
是的,因為您將回圈體括在括號中()。里面的所有東西都在一個子shell中運行,特別是變數定義和變化只影響子shell,它在每次迭代中都是新的。如果您希望所有內容都在同一個 shell 中運行,那么只需省略它們即可。
此外,
您沒有為 variable 設定初始值
GIGASUM,因此它最初為空(不是 0)。最后一行的末尾有一個雜散的反引號 (`)。
替代方案比
$()反引號更具可讀性。由于您已經假設有一個支持該形式的外殼,因此您應該始終如一地使用它。如果變數的值不能完全在你的控制之下,而且通常即使它們完全在你的控制之下,也應該參考它們的值的擴展。
您不應嘗試決議
ls. 通配有時完全足夠,而且find服務更廣泛。stat在特殊情況下與命令結合使用。ls -l決議的輸出以洗掉plainls沒有的所有內容尤其沒有意義。你從不設定變數
LOG目前尚不清楚為什么要迭代日志數量而不是直接迭代日志檔案名稱。
cat當您可以按名稱將檔案指定給第二個命令時,不要將檔案放入另一個命令。使用空格和換行符使您的代碼更清晰。有幾個地方可以自然地換行,而不會轉義換行符。
我相信還有更多可用的改進,但這涵蓋了上述所有內容:
# Supposing that you actually need the logfiles array for something later,
# after the loop (otherwise, you can put the glob directly into the `for` command):
logfiles=(~/*"${LOG_NAME}"log*)
GIGASUM=0
for LOG in "${logfiles[@]}"; do
SPEED=$(grep sum_sent -A7 "$LOG" |
grep bits_per_second |
tr "," " " |
awk '{ SUM =$NF } END { print SUM } ')
BITS=$(printf '%.0f' ${SPEED})
GIGABITS=$( bc -l <<< "scale=2; $BITS/1000000000" )
GIGASUM=$( echo "$GIGABITS $GIGASUM" | bc )
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447740.html
