سؤال
أحاول كتابة نص باش وكنت بحاجة إلى القيام ببعض الرياضيات العائمة. في الأساس أريد أن أفعل شيئًا كهذا:
NUM=$(echo "scale=25;$1/10" | bc)
if [ $? -ne 0 ]
then
echo bad
fi
المشكلة التي أواجهها هي $؟ يميل إلى الاحتفاظ بالإخراج من برنامج ECHO وليس مكالمة 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
. على سبيل المثال
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"
هل أنت بعد نتيجة حساب من قبل الميلاد (الذي تخزنه في 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