1. ホーム
  2. linux

[解決済み] Bashループのカウンターインクリメントが機能しない

2022-06-01 19:20:57

質問

次のような簡単なスクリプトがあり、ループを実行している。 COUNTER . なぜカウンターが更新されないのかがわかりません。作成されるサブシェルが原因でしょうか?どのように私は潜在的にこれを修正することができますか?

#!/bin/bash

WFY_PATH=/var/log/nginx
WFY_FILE=error.log
COUNTER=0
grep 'GET /log_' $WFY_PATH/$WFY_FILE | grep 'upstream timed out' | awk -F ', ' '{print $2,$4,$0}' | awk '{print "http://domain.com"$5"&ip="$2"&date="$7"&time="$8"&end=1"}' | awk -F '&end=1' '{print $1"&end=1"}' |
(
while read WFY_URL
do
    echo $WFY_URL #Some more action
    COUNTER=$((COUNTER+1))
done
)

echo $COUNTER # output = 0

どのように解決するのですか?

まず、カウンターを増やしていないことです。変更する COUNTER=$((COUNTER))COUNTER=$((COUNTER + 1)) または COUNTER=$[COUNTER + 1] を指定すると増加します。

次に、あなたが推測しているように、サブシェル変数を呼び出し側にバックプロパゲートするのはやっかいなことです。サブシェル内の変数は、サブシェルの外部では使用できません。これらは子プロセスにローカルな変数です。

これを解決する 1 つの方法は、中間値を保存するために一時ファイルを使用することです。

TEMPFILE=/tmp/$$.tmp
echo 0 > $TEMPFILE

# Loop goes here
  # Fetch the value and increase it
  COUNTER=$[$(cat $TEMPFILE) + 1]

  # Store the new value
  echo $COUNTER > $TEMPFILE

# Loop done, script done, delete the file
unlink $TEMPFILE