【问题标题】:Write a script with a for loop that counts from 0.5编写一个从 0.5 开始计数的带有 for 循环的脚本
【发布时间】:2014-10-25 03:39:05
【问题描述】:

这是我的脚本:

#!/bin/bash
        for ((i=0.5; i<=2.0; i+= 0.05)); do
            (   ./myExe -l t2000.bin i
            ) &
        done
        wait

错误是:

((: i=0.5: syntax error: invalid arithmetic operator (error token is ".5")

我知道这行不通,但我听说有办法做类似的事情,有什么建议吗?

【问题讨论】:

  • bash 只支持整数。
  • 我想过那个@EtanReisner,但我听说它可以做到,这就是我问的原因,但现在我得到了-1! :/ 此外,我不能删除问题,因为它有答案。
  • 是的,我不确定-1 是什么意思,但你可能会说“我知道这不起作用,但有人告诉我有办法做类似的事情它,建议?”可能比看起来像您不知道 bash 不会那样做的问题更好。
  • 我明白了,你建议我做什么@EtanReisner?感谢您的提示,我会记住这一点,以备将来使用。 :)
  • 用额外的解释更新你的问题不会有什么坏处。除此之外,我不确定您还能做些什么。

标签: bash


【解决方案1】:

你只能(轻松地)循环遍历整数;调用myExe时使用bc减少到正确的浮点值。

for ((i=50; i <= 200; i+=5)); do
    ./myExe -l t2000.bin $(bc <<< "scale=2; $i/100") &
done
wait

请注意,bash 根本不适用于浮点值。在这里,bc 命令的输出只是一个字符串,bash 不对其进行处理,而是将其作为参数传递给命令。

【讨论】:

  • 我会进行 while 循环并将 0.5 添加到循环内的种子值并检查整数 2 的 while 条件
  • +2 因为你们俩都比我少了 35 :)
  • @Ashish bash 不能将 0.5 添加到值,也不能将浮点值与整数进行比较。 任何涉及浮点运算的事情都必须由外部命令处理。
  • 我记得一开始我使用zcalc 进行浮点计算和if [ $(echo "$n1 &gt; $n2" | bc) -ne 0 ] 进行比较
  • zcalc 是另一个 shell zsh 的一部分,它可以处理浮点运算。
【解决方案2】:

不使用 bc:

for ((i = 50; i <= 200; i+=5)); do
  f=$((i/100)).$((i%100))
  echo $f
done

【讨论】:

    【解决方案3】:
    for i in 0.{5..9}{,5} 1.{0..9}{,5} 2.0; do echo $i; done
    

    或:

    for i in $(seq 0.5 0.05 2); do echo $i; done
    

    【讨论】:

    • 其他答案很明显为什么它们有效。在您提供的范围内究竟发生了什么?
    • 正如 Etan Reisner 提到的,bash 只支持整数,但 bash 可以做其他事情,比如“大括号扩展”。要查看会发生什么,请将其粘贴到您的 bash:echo 0.{5..9}{,5} 1.{0..9}{,5} 2.0。一个简单的例子:echo {4..5}{0..3}。结果:40 41 42 43 50 51 52 53。您还可以使用数组滥用“大括号扩展”将小十进制数转换为二进制数:stackoverflow.com/a/25943519/3776858
    • 尽管我很喜欢 bc,但这是 seq 的完美工作。
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多