13

私は bash スクリプトを作成しようとしていますが、浮動小数点演算を行う必要がありました。基本的に私はこのようなことをしたい:

NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi

私が遭遇している問題は $? bc 呼び出しではなく、echo プログラムからの出力を保持する傾向があります。bc プログラムからの出力を変数に保存する方法はありますか?

編集:

素早い返信ありがとうございます。この問題を別の方法で見ることができます。スクリプトを少し変更して、次のようにするとします。

#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
exit
fi
echo "$NUM"

ユーザーが通常の浮動小数点値を入力すると、正常に動作します。

bash script.sh 1.0

出力:

.1000000000000000000000000

ただし、ユーザーが間違った値を入力すると、スクリプトは回復できません。

bash script.sh 1.0a

出力:

(standard_in) 1: parse error

私がやろうとしているのは、それを優雅に終了させることです。

4

3 に答える 3

12

何も悪いことはありません。$NUMはbcコマンド結果を保持することになっています

見る:

NUM=$(echo "scale=25;$1/10" | bc)
echo "\$? is $?"
echo "NUM is $NUM"

出力

$ ./shell.sh 10
$? is 0
NUM is 1.0000000000000000000000000

別の方法はawkを使用することです

NUM=$(awk -vinput="$1" 'BEGIN{printf "%.25f", input/10 }')
echo "\$? is $?"
echo "NUM is $NUM"

もう1つの方法は、に渡す前に「$1」のチェックを行うことですbc。例えば

shopt -s extglob
input="$1"
case "$input" in
 +([0-9.]))
     IFS="."; set -- $input
     if [ $# -ne 2 ];then
        echo "bad decimal"
     else
        NUM=$(echo "scale=25;$1/10" | bc  )
        echo "$NUM"
     fi
esac

もうチェックする必要はありませ$?bc

于 2010-02-25T05:59:19.297 に答える
2

GNUbcの場合、「(standard_in) 1: syntax error」のようなエラーが stderr に出力されます。これを変数に取り込んで確認できます。

#!/bin/bash
NUM=$(echo "scale=25;$1/10" | bc 2>&1)
if [[ $NUM =~ error || $? -ne 0 ]]
then
    echo bad
    exit
fi
echo "$NUM"
于 2010-02-25T07:46:35.390 に答える
1

bc(NUMに格納)からの計算結果、またはシステムコールからのステータスリターンの後でしょうか。

私が言ったように、あなたは計算の結果を持っています$NUM

#bctest.sh
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi

echo "result: ", $NUM

テスト:

bash ./bctest.sh 15
result: , 1.5000000000000000000000000
于 2010-02-25T06:01:54.937 に答える