使用循环生成命令行参数

使用循环生成命令行参数

我正在尝试使用 for 循环来运行命令行参数,我从未尝试过这样做,并且遇到了一些麻烦。

我正在使用以下命令:

for((a=1; a<20; a++)); 
do 
    ./a.out -N 10000 -D .25*a -E 0.7788007831;
done

我正在使用 c 中的 getopt 函数来读取值。我想尝试不同的 D 值(在输出中称为 Delta)。但是,当我运行此命令时,我得到:

Acceptance rate is: 0.928400
Estimate is:        0.758704
Error is :          0.020097
Delta used:         0.250000

Acceptance rate is: 0.928400
Estimate is:        0.758704
Error is :          0.020097
Delta used:         0.250000

Acceptance rate is: 0.928400
Estimate is:        0.758704
Error is :          0.020097
Delta used:         0.250000

Acceptance rate is: 0.928400
Estimate is:        0.758704 
Error is :          0.020097
Delta used:         0.250000

...

Acceptance rate is: 0.928400
Estimate is:        0.758704
Error is :          0.020097
Delta used:         0.250000

我不确定问题是什么。

答案1

其一,如果要引用 shell 变量,则需要使用$foo表示法。a只是字母“a”(以同样的方式10000只是五个数字),但$a扩展到变量当时包含的任何内容。

二、在 shell 中进行算术运算,算术扩展的语法$(( expression )),因此您可以编写$(( 25 * $a ))以获取乘以 25 的值a。(以 10 为基数。)

尽管您在这里面临的问题是 Bash(和 POSIX shell)只能对整数进行算术运算,因此与 相乘0.25是行不通的。

在 zsh 中,浮点运算可以工作,所以你可以这样做

for ((a=1; a<20; a++)); do 
    echo $((.25 * $a))
done

但在 Bash 或标准 shell 中,您需要使用外部程序来进行数学计算:

for ((a=1; a<20; a++)); do 
    echo $( echo ".25 * $a" | bc -l )
done

或者在你的命令中:

for ((a=1; a<20; a++)); do 
    ./a.out -N 10000 -D $( echo ".25 * $a" | bc -l ) -E 0.7788007831;
done

当然,如果您正在运行的程序可以进行乘法运算并且您只想将字符串等传递.25*1.25*2它,那么您可以使用

... -D ".25*$a"

及其周围的引号,因为否则 被*视为文件名匹配(glob)。 (实际上,您通常需要在大多数使用变量扩展或命令替换的地方加上引号,但让我们参考一下什么时候需要双引号?关于这一点。)

在此处介绍的 shell 中进行浮点数学运算的方法有多种:如何在 bash 或其他语言/框架中进行整数和浮点计算?

相关内容