आप इस 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ओड्स को ओड करता है ।mT
p- इसका मतलब है कि यदि mस्टैक के वर्तमान शीर्ष से कम है, तो mइसे ( dवैसे भी, इसका अपग्रेड) बदल देता है और यहां printed किया जाता है, अन्यथा यह नहीं होता है और जो कुछ भी इनपुट किया गया था वह pइसके बजाय रंगा हुआ है ।
s0- बाद में (क्योंकि pस्टैक पॉप नहीं करता है) हम स्टैक के शीर्ष को 0फिर से डंप करते हैं , और फिर ...
lTx- रिकर्सिवली load 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कमांड के साथ सेट करते हैं, तो आप मनमानी परिशुद्धता के फ़्लोट्स को संभाल सकते हैं । और आप स्वतंत्र रूप से input या output मूलक को बदल सकते हैं - जो कभी-कभी उन कारणों के लिए उपयोगी हो सकता है जिनकी आप उम्मीद नहीं कर सकते हैं। उदाहरण के लिए:
echo 100000o 10p|dc
00010
... जो पहले dc100000 तक आउटपुट मूलांक सेट करता है फिर 10 प्रिंट करता है।