Bashループのカウンター増分が機能しない 質問する

Bashループのカウンター増分が機能しない 質問する

次のような簡単なスクリプトがあり、ループを実行して を維持したいと考えてい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.example"$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

ベストアンサー1

まず、カウンターは増加しません。またはCOUNTER=$((COUNTER))に変更するとカウンターが増加します。COUNTER=$((COUNTER + 1))COUNTER=$[COUNTER + 1]

2 番目に、サブシェル変数を呼び出し先に逆伝播するのは、ご想像のとおり、より困難です。サブシェル内の変数は、サブシェルの外部では使用できません。これらは、子プロセスにローカルな変数です。

これを解決する 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

おすすめ記事