shell 我在Linux的bash脚本中发现了一个错误,其中包含if条件和for循环

4szc88ey  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(188)
#!/bin/bash

for i in {1..99}
do
    if [ i%2 != 0 ];
    then 
        echo $i
    fi
     
done

我想打印1到99之间的所有奇数,但它正在打印1到99之间的所有数字,而不仅仅是赔率。为什么for循环中的简单if语句没有过滤掉偶数?

qv7cva1a

qv7cva1a1#

  • 使用算术展开
for i in {1..99} 
do 
    if [ $((i%2)) != 0 ]
        then 
            echo $i 
        fi
done

更好的解决方案

  • 来自@user1934428、@tshiono和@艾德莫顿的评论
for i in {1..99} 
do 
    if  ((i%2 != 0)) 
        then 
            echo "$i" 
        fi
done
ve7v8dk2

ve7v8dk22#

{start..end}结构的第三个参数为increment(默认值为+1):{start..end..increment}
要打印奇数值,请提供起始值和结束值,并以+2为增量,例如:

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的当前值)的内存,并且在每次循环中递增变量时需要(相对)少量的cpu。
这还产生:

1
3
5
7
... removed for brevity
93
95
97
99
gg0vcinb

gg0vcinb3#

原因是 * 字符串 * i%2永远不会与0相同,因此您的测试总是成功。
看来你想要一个算术测试:

if ((i%2 != 0))

相关问题