web-dev-qa-db-ja.com

Bashスクリプトとbc

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

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

私が遭遇している問題は$ですか? bc呼び出しではなく、エコープログラムからの出力を保持する傾向があります。 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

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

11
LandonSchropp

何も悪いことはありません。 $ 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つの方法は、bcに渡す前に「$ 1」のチェックを行うことです。例えば

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から$?をチェックする必要はもうありません

8
ghostdog74

GNU bcの場合、「(standard_in)1:構文エラー」と同様のエラーがstderrに出力されます。これを変数にキャプチャして確認できます。

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

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
1
stefanB