【问题标题】:Nested For loop counter reset嵌套 For 循环计数器重置
【发布时间】:2014-10-06 22:05:24
【问题描述】:

我正在尝试运行使用列表作为循环计数器的嵌套 for 循环。问题是一旦'delta'循环达到100,它不会重置为0。'edges'同样的问题。

我试过这个,但它似乎不适用于我的循环。 http://tldp.org/LDP/abs/html/nestedloops.html

这里有什么想法吗?这是我的代码:

#!/bin/sh

threads="1 2 4 8 16 32 64 96 128 160 192 224 256"
delta="0 10 20 30 40 50 60 70 80 90 100"
edges="16 8192"
nodes="16384"

for threads in $threads
do
    for delta in $delta
    do
        for edges in $edges
        do
            for nodes in $nodes
            do
                printf "\n"
                echo $threads
                echo $delta
                echo $edges
                echo $nodes
            done
        done
    done
done

预期输出:

1 0 16 16384 
1 0 8192 16384 
1 10 16 16384 
1 10 8192 16384 
1 20 16 16384 
1 20 8192 16384 

【问题讨论】:

  • 如果这是您的预期输出,那么脚本是正确的,因为它现在就是这样输出的。
  • 我希望内部循环再次从 0 开始(从它们列表的第一个元素开始),一旦外部循环进行每次迭代
  • 好的,我明白了,现在我们有了预期的输出。

标签: bash shell ubuntu nested-loops


【解决方案1】:

当像这样使用for 循环时,请确保为循环变量指定一个与您正在迭代的变量不同的名称。

使用for threads in $threads 会让人难以区分循环变量 (threads) 和循环对象 ($threads)。

当您稍后调用echo $threads 时,bash 不知道您指的是第一个。

在这种情况下,您可以将循环声明更改为 for n in nodesfor t in threads,然后在最内层循环中将 echo 输出 $n$t 以获得所需的输出。

【讨论】:

  • 我看不出这会如何改变它。我需要 13*10*2*1 次迭代。在节点中执行 for n,然后回显 $n 不会将循环计数器重置为 0...
  • 我不确定您所说的“将循环计数器重置为 0”是什么意思。但是,进行这些更改会在我的系统上提供预期的输出。
  • 你可以这样想象:每个 for 循环现在应该是这样的 for(i=0;i
  • 好的,我明白了。是this the output you're looking for?
  • 好的,我在回答中建议的更改给了我这个输出!如果还有什么不明白的,请告诉我:)
猜你喜欢
  • 1970-01-01
  • 2021-05-23
  • 2020-10-30
  • 1970-01-01
  • 2021-10-23
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多