ループを使用したコマンドラインパラメータの生成

ループを使用したコマンドラインパラメータの生成

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

まず、シェル変数を参照するには$foo表記法を使用する必要があります。aただ、文字「a」(100005桁の数字と同じ方法)しかありませんが、$aその時点で変数に含まれるすべての項目に展開されます。

2. シェルで算術演算を実行します。算術拡張構文はい、したがって値に25を掛けるように$(( expression ))書くことができます。 (10を基準とします。)$(( 25 * $a ))a

ここで直面する問題は、Bash(およびPOSIXシェル)が整数に対してのみ算術演算を実行できるため、これを掛けても0.25機能しないことです。

zshでは浮動小数点演算が機能するため、次のことができます。

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

ただし、Bashまたは標準シェルでは、数学を実行するには外部プログラムを使用する必要があります。

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)。 (実際に変数拡張や命令置換を使用するほとんどの場所には引用符を付ける必要がありますが、参考にしましょう。いつ二重引用符が必要ですか?この点について。 )

ここで説明されているシェルで浮動小数点演算を実行する方法はいくつかあります。Bashまたは他の言語/フレームワークで整数および浮動小数点計算を実行するには?

関連情報