【问题标题】:For loop over sequence of large numbers in Bash [duplicate]For循环遍历Bash中的大数序列[重复]
【发布时间】:2019-03-07 16:13:54
【问题描述】:

在 Bash 脚本中,我使用了一个简单的 for 循环,如下所示:

for i in $(seq 1 1 500); do
   echo $i
done

这个 for 循环工作正常。但是,当我想使用更大的数字序列(例如 10^8 到 10^12)时,循环似乎不会开始。

for i in $(seq 100000000 1 1000000000000); do
   echo $i
done

我无法想象,这些数字太大而无法处理。所以我的问题是:我错了吗?还是可能有其他问题?

【问题讨论】:

    标签: bash for-loop


    【解决方案1】:

    问题在于$(seq ...) 在循环执行之前 被扩展为单词列表。所以你的初始命令是这样的:

    for i in 100000000 100000001 100000002 # all the way up to 1000000000000!
    

    结果太长了,这是导致错误的原因。

    一种可能的解决方案是使用不同样式的循环:

    for (( i = 100000000; i <= 1000000000000; i++ )) do
      echo "$i"
    done
    

    这种“C 风格”结构使用终止条件,而不是遍历字面量列表。


    便携式风格,用于 POSIX shell:

    i=100000000
    while [ $i -le 1000000000000 ]; do
      echo "$i"
      i=$(( i + 1 ))
    done
    

    【讨论】:

    • 我也有同样的问题。但是,我想跳过 1000 多个数字。例如。我正在尝试做:for i in $(seq 2380000 1000 2390000); do echo "skip by 1000 value $i"; done,但输出如下:跳过 1000 值 2.38e+06 跳过 1000 值 2.381e+06 跳过 1000 值 2.382e+06 ... 我想要的输出是:跳过1000 值 2381000 跳过 1000 值 2382000 跳过 1000 值 2383000 ...我在 MACOS 上执行此操作,因此 {2380000..1000..2390000} 不起作用,因此使用“seq”。任何帮助将不胜感激
    • @Jenny 我猜你的seq 版本会自动格式化序列。也许您可以传递一个参数来自己指定格式(尝试man seq)。或者,您可以在我的答案中使用其他类型的循环之一,添加 1000 而不是 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多