#!/bin/bash for i in {1..99} do if [ i%2 != 0 ]; then echo $i fi done
我想打印1到99之间的所有奇数,但它正在打印1到99之间的所有数字,而不仅仅是赔率。为什么for循环中的简单if语句没有过滤掉偶数?
for
if
qv7cva1a1#
for i in {1..99} do if [ $((i%2)) != 0 ] then echo $i fi done
for i in {1..99} do if ((i%2 != 0)) then echo "$i" fi done
ve7v8dk22#
{start..end}结构的第三个参数为increment(默认值为+1):{start..end..increment}。要打印奇数值,请提供起始值和结束值,并以+2为增量,例如:
{start..end}
increment
{start..end..increment}
for i in {1..99..2}; do echo "$i"; done
如果唯一的目的是将值打印到stdout,则使用缩短版本:
printf "%s\n" {1..99..2}
这两者都产生:
1 3 5 7 ... removed for brevity 93 95 97 99
请记住,必须首先生成一系列值并保存在内存中。在这种情况下,50个值的生成和存储是微不足道的,但是如果你要生成一系列数百万的数字,那么你会看到仅仅为了生成/存储这些数字,CPU和内存的使用量就会大幅增加。对于较大的数字序列,使用以下代码更快,内存效率更高:
for ((i=1;i<=99;i+=2)) do echo "$i" done
注意:i+=2可以替换为i=i+2以获得相同的结果
i+=2
i=i+2
这种方法只需要一个值(变量i的当前值)的内存,并且在每次循环中递增变量时需要(相对)少量的cpu。这还产生:
i
gg0vcinb3#
原因是 * 字符串 * i%2永远不会与0相同,因此您的测试总是成功。看来你想要一个算术测试:
i%2
0
if ((i%2 != 0))
3条答案
按热度按时间qv7cva1a1#
更好的解决方案
ve7v8dk22#
{start..end}
结构的第三个参数为increment
(默认值为+1):{start..end..increment}
。要打印奇数值,请提供起始值和结束值,并以+2为增量,例如:
如果唯一的目的是将值打印到stdout,则使用缩短版本:
这两者都产生:
请记住,必须首先生成一系列值并保存在内存中。在这种情况下,50个值的生成和存储是微不足道的,但是如果你要生成一系列数百万的数字,那么你会看到仅仅为了生成/存储这些数字,CPU和内存的使用量就会大幅增加。
对于较大的数字序列,使用以下代码更快,内存效率更高:
注意:
i+=2
可以替换为i=i+2
以获得相同的结果这种方法只需要一个值(变量
i
的当前值)的内存,并且在每次循环中递增变量时需要(相对)少量的cpu。这还产生:
gg0vcinb3#
原因是 * 字符串 *
i%2
永远不会与0
相同,因此您的测试总是成功。看来你想要一个算术测试: