سؤال

أحاول كتابة نص باش وكنت بحاجة إلى القيام ببعض الرياضيات العائمة. في الأساس أريد أن أفعل شيئًا كهذا:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top