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
私がやろうとしているのは、それを正常に終了させることです。
何も悪いことはありません。 $ 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
から$?
をチェックする必要はもうありません
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