一尘不染

Bash循环中的计数器增量不起作用

linux

我有以下简单脚本,在其中运行循环并希望维护COUNTER。我无法弄清楚为什么计数器没有更新。是由于创建了subshel​​l导致的吗?我该如何解决呢?

#!/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

阅读 203

收藏
2020-06-02

共1个答案

一尘不染

首先,您没有增加计数器。更改COUNTER=$((COUNTER))COUNTER=$((COUNTER + 1))COUNTER=$[COUNTER + 1]将增加它。

其次,在您推测时将子shell变量反向传播给被调用者比较困难。子shell中的变量在子shell外部不可用。这些是子进程本地的变量。

解决此问题的一种方法是使用临时文件存储中间值:

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
2020-06-02