Bash 在shel中浮点数学中使用bc不成功

Bash 在shel中浮点数学中使用bc不成功,bash,bc,Bash,Bc,当我执行代码时,我得到的是: #!/bin/bash step=0.05 short=0.05 long=0.95 for firstloop in {1..20}; do ratio=0.05 for secondloop in {1..20} ; do echo $short $long $ratio >> file.txt time python3 main.py $

当我执行代码时,我得到的是:

#!/bin/bash
    step=0.05
    short=0.05
    long=0.95
    for firstloop in {1..20}; do
        ratio=0.05
        for secondloop in {1..20} ; do
            echo $short $long $ratio >> file.txt
            time python3 main.py $short $long $ratio >> file.txt
            ratio= `echo $ratio + $step` | bc
        done
        short= `echo $short + $step`| bc
        long= `echo $long + $step`| bc

    done
我尝试了许多变体,以便可以使用浮点值增加变量shortlongratio。我知道除非使用bc,否则无法在shell中处理浮点数学。我还没有成功。我做错了什么

修正空格错误和bc格式后,如下面的答案所述。我只剩下这个输出:

./script.sh: line 10: 0.05: command not found

real    0m25.329s
user    0m24.770s
sys 0m0.263s
./script.sh: line 10: 0.05: command not found

real    0m34.666s
user    0m32.319s
sys 0m0.623s
./script.sh: line 10: 0.05: command not found

real    0m31.425s
user    0m29.329s
sys 0m0.588s
./script.sh: line 10: 0.05: command not found
real 0m0.871s
用户0.497s
系统0m0.166s
++回声“0+0.05”
++卑诗省
+比率=.05
+对于“{1..20}”中的第二个循环
+回声01.05
+python3 main.py 0 1.05
回溯(最近一次呼叫最后一次):
文件“main.py”,第46行,在
main()
文件“main.py”,第17行,在main中
概率=[系统argv[:2]中x的浮点(x)]
文件“main.py”,第17行,在
概率=[系统argv[:2]中x的浮点(x)]
ValueError:无法将字符串转换为浮点:“main.py”

这基本上就是我在3个变量的值发生变化时反复得到的结果。

首先,我要提出一个风格建议:使用
$()
而不是反勾号。它们基本上是等价的,只是它们更容易阅读,语法也更简洁(在backticks中使用转义或嵌套backticks是…奇怪的)。此外,通常最好在变量引用周围加上双引号(例如,使用
python3 main.py“$short”$long“$ratio”
而不是
python3 main.py$short$long$ratio

现在,真正的问题是:首先,在赋值中不能在
=
周围加空格,否则它将被解析为完全不同的内容。一般来说,空格是shell语法中的关键分隔符,在复制示例时不应添加或删除空格

比较以下命令:

real    0m0.871s
user    0m0.497s
sys 0m0.166s
++ echo '0 + 0.05'
++ bc
+ ratio=.05
+ for secondloop in '{1..20}'
+ echo 0 1 .05
+ python3 main.py 0 1 .05
Traceback (most recent call last):
  File "main.py", line 46, in <module>
    main()
  File "main.py", line 17, in main
    probability = [float(x) for x in sys.argv[:2]]
  File "main.py", line 17, in <listcomp>
    probability = [float(x) for x in sys.argv[:2]]
ValueError: could not convert string to float: 'main.py'
ratio=0.05
ratio= 0.05
ratio = 0.05
第一个执行它看起来的操作——将变量
ratio
设置为“0.05”。第二个相当于
ratio=''0.05
——它尝试将“0.05”作为命令运行,并将变量设置为空字符串。这就是脚本正在执行的操作,这就是为什么会出现错误“0.05:command not found”。第三个命令尝试将“ratio”作为命令运行,并将参数“=”和“0.05”传递给它

第二个问题是,在捕获外部有到
bc
的管道。比较以下命令:

real    0m0.871s
user    0m0.497s
sys 0m0.166s
++ echo '0 + 0.05'
++ bc
+ ratio=.05
+ for secondloop in '{1..20}'
+ echo 0 1 .05
+ python3 main.py 0 1 .05
Traceback (most recent call last):
  File "main.py", line 46, in <module>
    main()
  File "main.py", line 17, in main
    probability = [float(x) for x in sys.argv[:2]]
  File "main.py", line 17, in <listcomp>
    probability = [float(x) for x in sys.argv[:2]]
ValueError: could not convert string to float: 'main.py'
ratio=0.05
ratio= 0.05
ratio = 0.05
第一个函数作为管道运行
echo“0.05+0.05”|bc
,然后捕获输出并将其存储在变量
ratio
中。这就是你想要的。第二种方法将
比率设置为“0.05+0.05”(
的输出为echo“0.05+0.05”
),然后将该比率的输出(没有)输送到
bc
bc
(如果有)的输出将被打印到终端,而不是被捕获

总之,您应该像这样替换每一行:

ratio=$(echo "0.05 + 0.05" | bc)
ratio=$(echo "0.05 + 0.05") | bc
ratio= `echo $ratio + $step` | bc
比如说:

ratio=$(echo "0.05 + 0.05" | bc)
ratio=$(echo "0.05 + 0.05") | bc
ratio= `echo $ratio + $step` | bc

执行任何赋值时,请不要使用空格
a=1
正确,而
a=1
不正确。@PS.谢谢您的输入。识别此代码中的几个问题。@pjh拼写检查未检测到任何问题,不是“拼写检查”。按现在的样子对代码发出14个警告。我添加了修改,现在我有了:“ValueError:无法将字符串转换为float:'main.py'”我发现bc的语法仍然不正确!在这种情况下,准确地知道传递的值很重要。将
set-x
放在本节前面(后面加上`set+x),它将在运行时打印它正在执行的命令的等效值。这些值是按逻辑进行的。虽然main.py文件没有执行,因为它仍然认为它们是字符串,因此只返回错误:ValueError:无法将字符串转换为float:'main.py'!!!!等等,它正在尝试将字符串“main.py”转换为浮点?这里还有一些其他错误——要么您正在向python脚本传递其他内容,要么它对如何获取其参数感到困惑。我们的想法是使用不同的输入来运行main.py文件多次,这些输入是:$ratio、$short和$long,这就是为什么脚本应该很方便的原因!我不明白字符串从哪里来,因为脚本中的变量显然是浮点数!