BASH算术问题

3

我正在使用BASH,现在有一个傻瓜问题需要解决。我正在开发一个项目,需要使用一些非常基本的算术表达式,但我意识到我的问题很多,因为我的变量没有更新。所以我组合了一个基本算法,在while循环中通过将一个变量按另一个变量进行增量操作,直到达到某个数字为止。

counter=1
counter2=0

while [[ counter2 < 10 ]]; do
   counter2=$(($counter2+$counter))
   echo $counter
   echo $counter2
done 

我运行了这个脚本,但是没有任何反应。为了好玩,我将 < 改成了 >,结果发生了无限循环,不断输出以下内容:
1
0
1
0

永远永远,直到我停止它。所以很明显变量没有改变。为什么?我感觉自己像个白痴,因为一定是我忽略了某些愚蠢的事情。当我使用<时,为什么也不会出现无限循环呢?为什么在这种情况下什么都不打印?如果counter2总是小于10,为什么它不会不断进行下去呢?
提前感谢大家。
编辑:好吧,我意识到为什么在检查<时没有输出任何内容...我应该使用$counter2而不是只有counter2来获取counter2的实际值。但现在它只是输出:
1
2

就是这样了...感觉自己好蠢啊。


当 [[ counter2 < 10 ]]; 或者当 [[ $counter2 < 10 ]]; - ring bearer
3个回答

4
$((...))中,不要使用符号($)。
counter2=$((counter2+counter))

你需要在括号前加上 sigil,否则它会抱怨需要 token。或者更确切地说,它会抱怨 '(' 是一个意外的 token,然后一切都变得混乱。 - RedMageKnight
是的,在括号之前,而不是里面。 - Kevin
啊,好的 - 好吧,我已经做了那个,但计数器2仍然只能到2 >.> 我就是不明白我可能漏掉了什么。 - RedMageKnight
只有在括号之前,如果这是一个独立的表达式。如果它是一个复合表达式(whileforif),则使用$。此外,while和设置变量然后在循环后看到结果是否存在问题? - 0xC0000022L
1
@STATUS_ACCESS_DENIED,您提到的问题发生在while循环是管道的一部分时。在这种情况下,循环在子shell中运行,并且变量的更改将在子shell结束时丢失。这里没有管道。 - glenn jackman

4

如果这全是bash代码(100%确定),您可以使用declare -i来明确设置变量类型,然后您的代码将变得非常简单:

declare -i counter=1
declare -i counter2=0

while [[ $counter2 -lt 10 ]]; do
   counter2=$counter2+$counter
   echo $counter
   echo $counter2
done

编辑: 在bash中,您可以使用双括号进行算术比较。因此,您的while循环可以写成:

while (($counter2 <  10)) ; do

这也没有任何作用,它只输出了 counter2 的结果直到 2。因此,我的输出大致看起来就像我在编辑后发布的内容一样 :/ - RedMageKnight
不,现在试试。我编辑了脚本。我没有测试我的第一篇帖子。你的条件检查也需要改变。 - ring bearer
那个 - 那个起作用了 >.> 我以为当你使用双括号时,你可以开始使用物理符号而不是缩写诸如“小于”和“大于”的东西。那么什么时候可以使用这些符号呢?O.o - RedMageKnight
我原以为在BASH中不需要像其他传统编程语言一样显式声明变量类型,是吗? - RedMageKnight
不,如果你在没有混淆的情况下处理剩余的编码,那么你不必这样做。但是当你对shell 100%确定时,这是一种方便。已编辑有关比较运算符的帖子。 - ring bearer
谢谢你的帮助,你今天为我解决了很多问题 :) - RedMageKnight

1
在Bash中,您可以使用类似C的for循环:
for (( counter2=0; counter2<10; counter2+=counter ))
do
   echo $counter": "$counter2
done

通常你会发现这种结构更加有吸引力:
for counter2 in {0..9}
do
    echo $counter": "$counter2
done

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