0

私が書いているスクリプトでは、小数の計算が必要なので、を使用することにしましbcた。私はこのツールに精通していないので、質問が些細なものであれば許してください。
コンソールを使用して次のように入力すると:

set r_m = `echo" scale = 6; $ pd_f * $ d_f *(1 / sqrt(3))+($ fr_numb-1)*($ pd_f * $ d_f *(1 / sqrt(3))+ $ pd_f * $ d_f * 0.5 *(s(3.14159265 * 30/180)/ c(3.14159265 * 30/180)))+ 0.4 "| bc -l`

それからecho "$r_m"それは私に与えます: 19.849870
($pd_fと$d_fは前にそれぞれ1.129と1.126と宣言されました、ああそして$ fr_numb = 18)

しかし(!)bashスクリプトで同じ行を使用します:

r_m = `echo" scale = 6; $ pd_f * $ d_f *(1 / sqrt(3))+($ fr_numb-1)*($ pd_f * $ d_f *(1 / sqrt(3))+ $ pd_f * $ d_f * 0.5 *(s(3.14159265 * 30/180)/ c(3.14159265 * 30/180)))+ 0.4 "| bc -l`

私に与える: .033022

なんで?

更新私はすべて=をバックティックで囲みました。以前、ブロッククォートでそれらを使用する方法を知りませんでした。

シェルはbash2.05です

4

4 に答える 4

1

。の場合、結果は.033022になりfr_numb=0ます。

ちなみに、インタラクティブコマンドは明らかにcshで実行されています。スクリプトがBashによって実行されていることを確認する場合は、スクリプトの最初の行に次の行があることを確認する必要があります。

#!/bin/bash

また、数式を読みやすくするために、いくつかのスペースと行継続を使用します。

#!/bin/bash
pd_f=1.129
d_f=1.126
fr_numb=18
fr_numb=0
r_m=$(echo "scale=6; \
    $pd_f*$d_f * (1 / sqrt(3)) + \
    ($fr_numb - 1) * ( \
        $pd_f * $d_f * (1 / sqrt(3)) + \
        $pd_f * $d_f * 0.5 * \
        ( \
            s(3.14159265 * 30 / 180) / c(3.14159265 * 30 / 180) \
        ) \
     ) + \
     0.4 " | bc -l)

ちなみに、質問を投稿するときは、変数の割り当てを投稿して、簡単にコピーできるようにして、「($pd_fと$d_fは以前にそれぞれ1.129と1.126と宣言されました。ああと$fr_numb」のような散文スタイルではなく、セットアップを再現できるようにします。 = 18)」これは、使用可能にするために大量の編集が必要です。

于 2011-02-19T17:21:40.663 に答える
1

このスクリプト

#!/bin/bash

pd_f=1.129
d_f=1.126
fr_numb=18

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

echo $r_m

19.849870を出力

GNU bash, Version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.

(bash駆動の)コンソールで入力したときの出力と同じです。スクリプトで定義されていないが、周囲のシェルでのみ定義されている場合は、スクリプトを呼び出す前に変数をエクスポートする必要がありますか?

于 2011-02-19T17:11:04.587 に答える
1

シェルに3つの変数が設定されている場合、次に例を示します。

pd_f=1
d_f=2
fr_numb=3

そして、元のコマンドを実行します。

set r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

次に、に$1設定されますr_m=5.018798(他のすべての位置パラメータは未定義です)。これは、bashおよび他のすべてのBourneシェル派生物では、ステートメントがシェルオプションを調整するため、または位置パラメーター、、、...などsetの意味を設定するために使用されるためです(ただし、ではありません)。$1$2$0

3つの変数の値がない場合は、によって診断された構文エラーが発生しbcます。

特に、元のコマンドは変数を設定しないことに注意してくださいr_m。これは、CシェルまたはCシェル派生物にのみ変数を設定します。シェル変数は、ステートメント$r_mの影響をまったく受けません。set結果として見たのは$r_m、前の実験の変数にたまたま残っていたものです。

一方、実行する場合:

r_m=`echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l`

次に、変数に割り当てますr_m

于 2011-02-19T17:47:01.620 に答える
0

コマンドを$()で囲みます

r_m=$(echo "scale=6; $pd_f*$d_f*(1/sqrt(3))+($fr_numb-1)*($pd_f*$d_f*(1/sqrt(3))+$pd_f*$d_f*0.5*(s(3.14159265*30/180)/c(3.14159265*30/180)))+0.4"|bc -l)
于 2011-02-19T12:45:56.313 に答える