आप इस dc
तरह से सिर्फ दो नंबरों की तुलना कर सकते हैं:
dc -e "[$1]sM $2d $1<Mp"
... जहां "$1"
आपका अधिकतम मूल्य है और "$2"
वह संख्या है जो आप प्रिंट करेंगे यदि वह इससे कम है "$1"
। इसके लिए भी GNU की आवश्यकता होती है dc
- लेकिन आप वही काम कर सकते हैं जैसे कि:
dc <<MAX
[$1]sM $2d $1<Mp
MAX
उपरोक्त दोनों मामलों में आप 0 (डिफ़ॉल्ट) जैसे कुछ के अलावा सटीक सेट कर सकते हैं ${desired_precision}k
। दोनों के लिए यह भी आवश्यक है कि आप यह सत्यापित करें कि दोनों मूल्य निश्चित रूप से संख्याएँ हैं क्योंकि कॉल डब्ल्यू / ऑपरेटर dc
कर सकते हैं ।system()
!
निम्न लिपि (और अगले) के साथ आपको इनपुट को भी सत्यापित करना चाहिए - जैसे grep -v \!|dc
या कुछ को मनमाने ढंग से इनपुट को मजबूती से संभालना चाहिए। आपको यह भी पता होना चाहिए कि dc
एक _
उपसर्ग के बजाय एक उपसर्ग के साथ नकारात्मक संख्याओं की व्याख्या करता है -
- क्योंकि बाद वाला घटाव ऑपरेटर है।
इसके अलावा, इस स्क्रिप्ट के साथ dc
कई अनुक्रमिक \n
ईवलाइन अलग संख्याओं में पढ़ा जाएगा जैसा कि आप इसे प्रदान करना पसंद करेंगे, और प्रत्येक के लिए या तो अपने $max
मूल्य या इनपुट के लिए प्रिंट करें , जिसके आधार पर wo की कम है:
dc -e "${max}sm
[ z 0=? d lm<M p s0 lTx ]ST
[ ? z 0!=T q ]S?
[ s0 lm ]SM lTx"
तो ... तो उनमें से प्रत्येक [
वर्ग कोष्ठकों के भीतर ]
विस्तार एक है dc
स्ट्रिंग उद्देश्य यह है कि है S
में से किसी एक - अपने संबंधित सरणी के लिए प्रत्येक aved T
, ?
, या M
। कुछ अन्य चीजों के अलावा dc
एक स्ट्रिंग के साथ कर सकते हैं, यह भी x
एक एक के रूप में ई एक्यूट कर सकते हैं । यदि आप इसे सही ढंग से व्यवस्थित करते हैं तो पूरी तरह से काम करने वाली dc
लिपि को पर्याप्त रूप से इकट्ठा किया जाता है।
dc
एक स्टैक पर काम करता है । सभी इनपुट ऑब्जेक्ट को अंतिम पर स्टैक्ड किया जाता है - प्रत्येक नई इनपुट ऑब्जेक्ट अंतिम टॉप ऑब्जेक्ट को धक्का देती है और इसके नीचे सभी ऑब्जेक्ट्स को एक से एक करके जोड़ दिया जाता है। किसी ऑब्जेक्ट के अधिकांश संदर्भ शीर्ष स्टैक मान के लिए होते हैं, और अधिकांश संदर्भ पॉप के ऊपर होते हैं जो स्टैक के शीर्ष (जो एक के ऊपर एक करके सभी वस्तुओं को नीचे खींचता है) ।
मुख्य स्टैक के अलावा, इसमें (कम से कम) 256 ऐरे भी होते हैं और प्रत्येक एरे तत्व अपने सभी स्टैक के साथ आता है। मैं यहाँ बहुत का उपयोग नहीं करते। मैं सिर्फ स्ट्रिंग के रूप में उल्लेख किया है तो मैं कर सकते हैं की दुकान l
उन्हें जब चाहता था oad और ई x
उन्हें ecute सशर्त, और मैं s
फाड़ $max
के शीर्ष में के मूल्य m
सरणी।
वैसे भी, यह थोड़ा सा dc
, बड़े पैमाने पर, आपकी शेल-स्क्रिप्ट क्या करता है। यह GNU-ism -e
विकल्प का उपयोग करता है - जैसा कि dc
आम तौर पर अपने मापदंडों को मानक-इन से लेता है - लेकिन आप ऐसा ही कर सकते हैं:
echo "$script" | cat - /dev/tty | dc
... अगर $script
उपरोक्त बिट की तरह देखा।
यह इस तरह काम करता है:
lTx
- यह l
ओड्स और ई परीक्षणx
के शीर्ष में संग्रहीत मैक्रो का T
परीक्षण करता है (मुझे लगता है - मैं आमतौर पर उन नामों को मनमाने ढंग से चुनता हूं) ।
z 0=?
- T
स्था तो स्टैक डेप्थ w / z
और का परीक्षण करता है , यदि स्टैक खाली है (पढ़ें: 0 ऑब्जेक्ट्स रखता है) यह ?
मैक्रो कहता है ।
? z0!=T q
- ?
मैक्रो को ?
dc
बिलिन कमांड के लिए नामित किया गया है जो स्टड से इनपुट की एक पंक्ति को पढ़ता है, लेकिन मैंने इसके साथ एक और z
स्टैक डेप्थ टेस्ट भी जोड़ा है, ताकि q
अगर यह एक खाली लाइन में खींचता है या ईओएफ को हिट करता है तो यह पूरे छोटे प्रोग्राम को यूआईटी कर सकता है । लेकिन अगर यह !
नहीं होता है और इसके बजाय सफलतापूर्वक स्टैक को आबाद करता है, तो यह T
फिर से कॉल करता है ।
d lm<M
- T
एस्ट तब d
स्टैक के शीर्ष को ऊपर उठाएगा और इसकी तुलना $max
(जैसा कि संग्रहित है m
) से करेगा । यदि m
कम मूल्य है, dc
तो M
मैक्रो को कॉल करें ।
s0 lm
- M
बस स्टैक के शीर्ष को पॉप करता है और इसे डमी स्केलर पर डंप करता है 0
- स्टैक को पॉप करने का सिर्फ एक सस्ता तरीका। यह भी वापस जाने से पहले l
ओड्स को ओड करता है ।m
T
p
- इसका मतलब है कि यदि m
स्टैक के वर्तमान शीर्ष से कम है, तो m
इसे ( d
वैसे भी, इसका अपग्रेड) बदल देता है और यहां p
rinted किया जाता है, अन्यथा यह नहीं होता है और जो कुछ भी इनपुट किया गया था वह p
इसके बजाय रंगा हुआ है ।
s0
- बाद में (क्योंकि p
स्टैक पॉप नहीं करता है) हम स्टैक के शीर्ष को 0
फिर से डंप करते हैं , और फिर ...
lTx
- रिकर्सिवली l
oad T
स्था एक बार फिर उसके बाद ई x
फिर ecute यह।
तो आप अपने टर्मिनल पर इस छोटे से स्निपेट और अंतःक्रियात्मक प्रकार की संख्याओं को चला सकते हैं और आपके द्वारा dc
वापस दर्ज की गई संख्या या $max
आपके द्वारा टाइप किए गए नंबर का मान बड़ा होगा। यह मानक इनपुट के रूप में किसी भी फ़ाइल (जैसे पाइप) को भी स्वीकार करेगा । यह तब तक रीड / तुलना / प्रिंट लूप जारी रखेगा जब तक कि यह एक रिक्त रेखा या EOF से सामना नहीं करता है।
हालांकि इसके बारे में कुछ नोट - मैंने यह आपके शेल फ़ंक्शन में व्यवहार का अनुकरण करने के लिए लिखा था, इसलिए यह केवल प्रति पंक्ति एक नंबर को मजबूती से संभालता है। dc
हालाँकि, प्रति पंक्ति के रूप में कई अलग-अलग अंतरिक्ष संख्याओं को संभाल सकते हैं क्योंकि आप इसे फेंकना चाहते हैं। हालाँकि , एक पंक्ति पर अंतिम संख्या के ढेर होने के कारण, यह चलने वाली पहली हवा होती है, और इसलिए, जैसा कि लिखा गया है, dc
इसके आउटपुट को रिवर्स में प्रिंट करेगा यदि आपने इस पर प्रति पंक्ति एक से अधिक नंबर टाइप / प्रिंट किया है। संभाल करने के लिए है कि एक सरणी में एक लाइन स्टोर करने के लिए है, तो यह काम करने के लिए।
ऐशे ही:
dc -e "${max}sm
[ d lm<M la 1+ d sa :a z0!=A ]SA
[ la d ;ap s0 1- d sa 0!=P ]SP
[ ? z 0=q lAx lPx l?x ]S?
[q]Sq [ s0 lm ]SM 0sa l?x"
लेकिन ... मुझे नहीं पता कि क्या मैं यह समझाना चाहता हूं कि काफी गहराई में। यह कहने के लिए पर्याप्त है कि जैसा कि dc
स्टैक पर प्रत्येक मूल्य में पढ़ा जाता है, यह या तो इसके मूल्य या $max
अनुक्रमित सरणी में मान को संग्रहीत करता है, और, जब यह पता लगाता है कि स्टैक एक बार फिर से खाली है, तो यह दूसरे को पढ़ने के प्रयास से पहले प्रत्येक अनुक्रमित ऑब्जेक्ट को प्रिंट करता है। इनपुट की लाइन।
और इसलिए, जबकि पहली स्क्रिप्ट करता है ...
10 15 20 25 30 ##my input line
20
20
20
15
10 ##see what I mean?
दूसरा करता है:
10 15 20 25 30 ##my input line
10 ##that's better
15
20
20 ##$max is 20 for both examples
20
यदि आप पहली बार इसे k
कमांड के साथ सेट करते हैं, तो आप मनमानी परिशुद्धता के फ़्लोट्स को संभाल सकते हैं । और आप स्वतंत्र रूप से i
nput या o
utput मूलक को बदल सकते हैं - जो कभी-कभी उन कारणों के लिए उपयोगी हो सकता है जिनकी आप उम्मीद नहीं कर सकते हैं। उदाहरण के लिए:
echo 100000o 10p|dc
00010
... जो पहले dc
100000 तक आउटपुट मूलांक सेट करता है फिर 10 प्रिंट करता है।