我有以下简单脚本,在其中运行循环并希望维护COUNTER。我无法弄清楚为什么计数器没有更新。是由于创建了subshell导致的吗?我该如何解决呢?
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]将增加它。
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