दिलचस्प पोस्ट
दो तालिका संरचना के बीच अंतर कार्य शेड्यूलर में चलने वाली PowerShell अब तक पॉइंटर्स और निकट पॉइंटर्स के बीच अंतर क्या है? रेलवे, जावास्क्रिप्ट link_to सहायक के माध्यम से क्लिक करने के बाद लोड नहीं हो रहा है अजगर में ओवरलोडिंग ऑपरेटर नकारात्मक रूपरेखा नियमित अभिव्यक्ति पायथन के साथ Excel (xls) फ़ाइलों को पढ़ना / पार्स करना अंतिम स्थिर विधि का व्यवहार IPhone पर संपीड़न एपीआई Android पर नोडजेएस चलाने के लिए व्यवहार्य विकल्प (अगस्त 2017) विंडोज़ पर पीआईपी स्थापित प्रवेश अस्वीकृत एचटीएमएल 5: मेरा "अननुवालिड" विशेषता पैटर्न को असफल क्यों करता है? कमांड लाइन पर सीएसवी में XLS कन्वर्ट करें नॉन-ओवरलैपिंग सरणी ब्लॉक्स प्राप्त करने के लिए नम्पी स्ट्राइड_ट्रिक्स का उपयोग करना प्रिंट संवाद के बिना विंडोज़ सेवा से एचटीएमएल दस्तावेज़ प्रिंट करें

बाँस में वैरिएबल के साथ फ़्लोटिंग प्वाइंट कॉन्ट्रैक्ट

मैं एक अस्थायी बिंदु चर की एक पूर्णांक को तुलना करना चाहता हूं। मुझे पता है कि यह सर्वश्रेष्ठ करने के लिए बाश के साथ नहीं है, लेकिन मेरी पूरी स्क्रिप्ट पहले से ही बाश में लिखी गई है। $ संख्या किसी भी पूर्णांक हो सकती है यदि यह नीचे या 50 के बराबर है, तो मैं आउटपुट 1 चाहता हूं, अन्य सभी के लिए मैं अन्य चर के साथ एक आउटपुट चाहता हूं। अभी तक मेरे पास इतना ही है:

number=43 test=$(echo "scale=2; $number/50" | bc -l) echo "$test" for k in {1..5} do if ["$test" -le 1] then echo "output" elif ["$test" -gt $k] then echo "output$k" fi done 

अगर मैं परीक्षण = 0.43 के साथ कोशिश करता हूँ, तो पहले लूप भी काम नहीं करता। मुझे लगता है कि यह एक पूर्णांक और एक अस्थायी बिंदु की तुलना के साथ करना है, लेकिन इसे काम नहीं कर सकता।

जो कुछ मैं याद कर रहा हूँ?

पी एस: यह [0.43: command not found जो टर्मिनल आउटपुट है I

वेब के समाधान से एकत्रित समाधान "बाँस में वैरिएबल के साथ फ़्लोटिंग प्वाइंट कॉन्ट्रैक्ट"

बास फ़्लोट को नियंत्रित नहीं कर सकते इसके बजाय bc को पाइप करें:

 if [ $(echo " $test > $k" | bc) -eq 1 ] 

आप जो भी त्रुटि देखते हैं, वह है क्योंकि test आदेश (यानी) को पहले और बाद में रिक्त स्थान की आवश्यकता होती है

इसका उपयोग करने के लिए बेहतर (( ... )) क्योंकि आप इस तरह से संख्याओं की तुलना करते हैं:

 if (( $(bc <<< "$test > $k") )) 

लूप का हिस्सा इस तरह दिखना चाहिए:

 if (( $(bc <<< "$test <= 1") )) then echo "output" elif (( $(bc <<< "$test > $k") )) then echo "output$k" fi 

रिलेशनल एक्सप्रेशन 0 का मूल्यांकन करते हैं, यदि रिलेशन गलत है, और 1 अगर रिलेशनशिप सच है [ स्रोत ]। नोट हालांकि यह GNU bc का एक व्यवहार है, और यह POSIX compiant नहीं है।

एक पुराने प्रश्न की तरह, लेकिन यह एक अतिरिक्त उत्तर मुझे लगता है।

जबकि एक उच्च परिशुद्धता कैलकुलेटर (बीसी या डीसी) के लिए पाइपिंग काम करता है, यह एक कांटा और एक अतिरिक्त प्रक्रिया की लागत पर है, क्योंकि उन कैलकुलेटर bash में नहीं बने हैं। एक बात जो कि में बनाया गया है, हालांकि, printf इसलिए यदि आप अपने अंकों को किसी विशेष संख्या में दशमलव स्थान के भीतर सौंप सकते हैं, तो आप इस तरह से एक समारोह के साथ "नकली" चल बिन्दु तुलना कर सकते हैं:

 #!/usr/bin/env bash function [[[ () { local LANG=C lhs rhs printf -v lhs '%07.3f' "$1"; lhs=${lhs/./} printf -v rhs '%07.3f' "$3"; rhs=${rhs/./} case "$2" in -lt) return $(( ! ( 10#$lhs < 10#$rhs ) )) ;; -le) return $(( ! ( 10#$lhs <= 10#$rhs ) )) ;; -eq) return $(( ! ( 10#$lhs == 10#$rhs ) )) ;; -ge) return $(( ! ( 10#$lhs >= 10#$rhs ) )) ;; -gt) return $(( ! ( 10#$lhs > 10#$rhs ) )) ;; esac } number=${1:-43} test=$(dc -e "2k $number 50 / p") echo "$test" for k in {1..5}; do if [[[ "$test" -le 1 ]]]; then echo "output" elif [[[ "$test" -gt "$k" ]]]; then echo "output $k" fi done 

यहाँ पर विचार करने के लिए कुछ चीजें

  • मैंने फ़ंक्शन का नाम दिया है [[[ प्यारा होना आप जो भी चाहें उसे नाम दे सकते हैं ntest या mynumericcomparison या यहां तक ​​कि [[[
  • printf एक आंतरिक कार्य है जो कि बाश के भीतर है, इस तथ्य के बावजूद कि यह आपके रास्ते पर है, इसके लिए एक कांटा की कीमत नहीं है।
  • जैसा कि यह खड़ा है, फ़ंक्शन 999.9 99 तक नंबर का समर्थन करता है। यदि आपको अधिक संख्या (या अधिक सटीकता) की आवश्यकता है, तो printf स्वरूपों को समायोजित करें।
  • case स्टेटमेंट के अंदर प्रत्येक वेरिएबल की शुरुआत में 10# आधार 10 पर होने वाली तुलना को बल देना है, क्योंकि शून्य-गद्देदार संख्या अन्यथा अष्टक के रूप में व्याख्या की जा सकती है।

यह भी देखें: http://mywiki.wooledge.org/BashFAQ/022