【问题标题】:BASH Arithmetic IssuesBASH 算术问题
【发布时间】:2012-04-22 08:27:20
【问题描述】:

我在 BASH 工作,我现在正处于白痴时刻。我有一个正在处理的项目,我将需要使用一些非常基本的算术表达式,我刚刚意识到我的很多问题是因为我的变量没有更新。所以我拼凑了一个基本算法,它通过一个while循环将一个变量增加另一个变量,直到达到某个数字。

counter=1
counter2=0

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

我运行脚本。什么也没做。我将&lt; 设置为&gt; 只是为了踢球,然后出现无限循环,重复输出:

1
0
1
0

直到我停止它。所以很明显变量没有改变。为什么?我觉得自己像个白痴,因为它一定是我忽略的一些愚蠢的东西。为什么,当我有&lt; 时,它也不是无限循环?为什么它根本不打印任何东西?如果counter2 总是小于 10,为什么不一直持续下去呢?

提前谢谢大家。

编辑:嗯,我知道为什么当支票是&lt; 时它没有输出任何东西...我应该使用$counter2 而不是仅仅使用counter2 来获得counter2 的实际值.但现在它只是输出:

1
2

就是这样……我觉得自己像个笨蛋。

【问题讨论】:

  • while [[ counter2

标签: bash arithmetic-expressions


【解决方案1】:

$((...)) 内,不要使用印记 ($)。

counter2=$((counter2+counter))

【讨论】:

  • 你需要括号前的印记,否则它会抱怨它需要令牌。或者更确切地说,它抱怨 '(' 是一个意外的标记,一切都变得很时髦。
  • 是的,在括号之前,而不是在里面。
  • 啊,好吧 - 好吧,我已经这样做了,但 counter2 仍然只能达到 2 >。> 我只是不明白我可能会错过什么。
  • 仅在括号之前,如果这是一个独立的表达式。如果它是复合表达式(whileforif),您也必须使用$。另外,while 和设置变量然后在循环后查看结果是否存在问题?
  • @STATUS_ACCESS_DENIED,当while循环是管道的一部分时,您提到的问题就会发生。在这种情况下,循环在子shell 中运行,并且在子shell 结束时对变量的更改将丢失。这里没有管道。
【解决方案2】:

如果这都是 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 的结果。所以我的输出与我编辑后发布的大致完全相同:/
  • 不,现在试试。我编辑了脚本。我没有测试我的第一篇文章。您的条件检查也需要更改。
  • 那——那行得通>。> 我认为当你使用双括号时,你可以开始使用物理符号而不是首字母缩略词来表示“小于”和“大于”之类的东西。那么什么时候可以使用这些符号呢? O.o
  • 我认为您不必像在 BASH 中使用其他传统编程语言那样显式声明变量类型?
  • 不,你不必这样做 - 如果你在不混淆的情况下处理其余的编码。但是当对外壳有 100% 的把握时,这是一种方便。编辑了关于比较运算符的帖子。
【解决方案3】:

在 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

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 2016-08-22
    • 1970-01-01
    • 2014-12-24
    • 2011-01-25
    • 2011-05-10
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多