当前位置: 首页 > 面试题库 >

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

韦叶秋
2023-03-14
问题内容

我有以下简单脚本,在其中运行循环并希望维护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

问题答案:

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


 类似资料:
  • 我正在遍历一个LinkedHashMap并递增I counter,下面是我使用for循环的方式

  • 我希望每次点击“添加到购物车”按钮时,计数在navbar中增加,但我不明白为什么我的代码不起作用,当我点击添加到购物车按钮时,当前计数器没有增加。如果有人能告诉我我错过了什么,或者给我一个更好的解决办法,我会很感激的,谢谢! null null

  • 问题内容: 在下面的示例代码中,是否真的需要counter = 0,还是有更好,更多的Python方法来访问循环计数器?我看到了一些与循环计数器有关的PEP,但它们要么被延迟要么被拒绝(PEP 212 和PEP 281)。 这是我的问题的简化示例。在我的实际应用程序中,这是通过图形完成的,整个菜单必须每帧重新绘制一次。但这以易于复制的简单文本方式进行了演示。 也许我还应该补充一点,我正在使用Pyt

  • 我正在尝试编写一个简单的程序,它将使用Scanner进行输入并输出最低数字、最高数字以及它们的平均值。但我不希望数字低于0或大于100。我有输出最小值、最大值和平均值的程序,它会告诉我是否输入了小于0或大于100的数字,但它仍然将其视为for循环中的“旋转”。我基本上希望程序返回到上一个数字,而不是在输入错误数字时继续在for循环中前进。有什么建议吗?谢谢!

  • 问题内容: 我对JMeter还是很陌生,我试图 使用循环控制器和JSR223 PostProcessor 来增加用户定义变量中预定义的计数器变量,但它似乎运行不佳。我查看了有关 JMeter循环的各种示例和计数器示例,以解决此问题,但配置元素Counter也未随循环增加。有人可以让我知道我做错了吗? 这就是我尝试使用后处理器递增计数器的方式,并且日志显示计数器未针对每个循环递增。我想将计数器提高到

  • 问题内容: 我想打印递减数字,例如: 然后我得到了jsp异常: 但是这个答案说有可能以两种方式循环: JSTL forEach逆序 我怎么了 问题答案: 我不确定其他问题的回答者如何使其起作用,但是我无法在参考JSTL实现中使其起作用。 无论如何,您可以通过以下方式达到要求: 或者,如果您想避免重复: