Bash语法错误,例如`syntax error: operand expected (error token is "{1 % 2 ")`。

7
请告诉我为什么使用以下代码在bash脚本中打印奇数会出现错误:

第3行:{1 % 2 : 语法错误:需要操作数(错误标记为"{1 % 2 ")

for i in {1 to 99}
do
rem=$(( $i % 2 ))
if [$rem -neq 0];
then
echo $i
fi
done

7
将您的脚本通过https://www.shellcheck.net/运行。它会发现两个语法错误。 - John Kugelman
对于源代码:空格不需要缴税,需要时可以自由使用! - U. Windl
8个回答

26

这是一个可行的示例:

for i in {1..99}
do
        rem=$(($i % 2))
        if [ "$rem" -ne "0" ]; then
                echo $i
        fi
done
  1. 使用 for 循环时,最小和最大数字的拼写错误,应该是 {1..99} 而不是 {1 to 99}
  2. if 语句的括号需要在左右两侧用 空格 分隔
  3. 比较应该使用 neq 而不是 ne,请参考此参考文献

如已指出,如果您需要澄清所得到的错误,可以使用此 shell 检查器


11

我不太确定为什么没有人包含它,但这对我有用,并且比其他“for”解决方案更简单:

for (( i = 1; i < 100; i=i+2 )); do echo $i ; done

1
这是最佳解决方案。 - Conor McNally

6

打印出1到99之间的奇数

seq 1 99 | sed -n 'p;n'

使用GNU的seq命令,感谢gniourf-gniourf

seq 1 2 99

例子

$ seq 1 10 | sed -n 'p;n'
1
3
5
7
9

如果你反转它,它会打印出偶数

$ seq 1 10 | sed -n 'n;p'
2
4
6
8
10

3
使用GNU seq命令,您可以这样做:seq 1 2 99。不需要使用sed。但我不确定这个答案是否对问题的提出者有用。 - gniourf_gniourf
或者使用当前的bash:echo {1..99..2} - Cyrus
@Cyrus:相反,使用 printf '%s\n' {1..99..2} - gniourf_gniourf
1
显然,OP是新手对于Shell编程。这个答案是正确和不错的,但我认为对于OP来说并不好理解或直观。 - pynexj

2

简述:

for odd in {1..99..2}; do echo "${odd}"; done

在集群中打印。
for odd in {1..99..2}; do echo -n " ${odd} "; done

同样地,仅打印偶数:

for even in {2..100..2}; do echo "${even}"; done

或者

for even in {2..100..2}; do echo -n " ${even} "; done

无法在Bash 3.2.57版本中工作。 - Grijesh Chauhan

1

{1 to 99}替换为{1..99}


1
那个例子需要修复的不仅仅是这些,你可以尝试使用这个修改来测试一下。 - DevDio

0
for (( i=1; i<=100; i++ ))
do
    ((b = $i % 2))
  if [ $b -ne 0 ] 
    then
    echo $i
fi
done

我得到了“bash:syntax error near unexpected token `if'”的错误,而@DevDio上面的解决方案是有效的。 - Adam Smith

0
for i in {0..49}
do
 echo $(($i*2+1))
done

0
for i in {1..99}
do
    rem=`expr $i % 2`
    if [ $rem == 1 ]
    then
        echo  "$i"
    fi
done

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - wscourge
@wscourge:为什么不呢?这样做真的会从解释中受益,特别是与现有答案区分开来。但这是回答问题的一种尝试。 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接