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

新手上路,请多包涵

我有以下简单的脚本,我正在运行一个循环并想要维护一个 COUNTER 。我无法弄清楚为什么计数器没有更新。是因为创建了子shell吗?我怎样才能解决这个问题?

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

原文由 Sparsh Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 499
2 个回答

首先,您没有增加计数器。将 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

原文由 bos 发布,翻译遵循 CC BY-SA 3.0 许可协议

COUNTER=1
while [ Your != "done" ]
do
     echo " $COUNTER "
     COUNTER=$[$COUNTER +1]
done

测试 BASH:Centos、SuSE、RH

原文由 Jay Stan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题