सरल कमांड-लाइन कैलकुलेटर


19

मुद्दा:

हर अब और फिर मुझे कमांड-लाइन वातावरण में सरल अंकगणित करने की आवश्यकता है। ईजी ने निम्नलिखित आउटपुट दिए:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

विभाजन 3 और 5 के बीच असंबद्ध स्थान के आकार को कमांड लाइन पर गणना करने का एक सरल तरीका क्या है ?

मैंने पहले से ही क्या कोशिश की है:

बीसी

bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
236-192
44
quit

जहां बोल्ड ऊपर सब सामान मैं एक सरल करने के लिए टाइप करने की आवश्यकता है 236-192के रूप में bc 1+1गूँजFile 1+1 is unavailable.

expr

expr 236 - 192

जहाँ मैं टाइप करने की आवश्यकता रिक्त स्थान से पहले और के रूप में ऑपरेटर के बाद expr 1+1सिर्फ गूँज 1+1


3
आप इस सहभागी करने के लिए इच्छुक है, तो आप टाइप करने के लिए की जरूरत नहीं है quitमें bc; दबाने ctrl-Dसे यह किसी भी इंटरैक्टिव प्रोग्राम में होगा।
मार्सेल

2
dc(IMO) से बहुत बेहतर है bc
विलियम पर्सेल 22

1
मुझे लगता है कि ptn 3 और 5 के बीच का खाली स्थान 236 - 192 होना चाहिए, और 236 - 128 नहीं होना चाहिए?
डिजिटल ट्रॉमा

@DigitalTrauma अच्छी नज़र! (यह सिर्फ एक उदाहरण था और किसी ने देखा नहीं कि एक!)
Fabby

1
@JanM। मैं वह हूं जो उखड़ गया .... ;-)
Fabby

जवाबों:


33

आप उपयोग करने में शामिल क्रिया की मात्रा को बहुत कम कर सकते हैं bc:

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(यह मानते हुए कि आपका शेल समर्थन करता है)।

यदि आप एक समारोह के रूप में है कि:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

cयदि आप इसे हमेशा उपलब्ध कराना चाहते हैं तो परिभाषा को अपनी पसंदीदा शेल स्टार्टअप फाइल में स्टोर करें ।


2
bc<RET>236-128<RET>quit<RET>16 कीस्ट्रोक्स है। bc<<<"236-128"<RET>15 कीस्ट्रोक्स है। ऐसा नहीं है जिसे मैं "टाइपिंग की बहुत कम मात्रा" कहूंगा "इसके अलावा, के bcसाथ बाहर निकला जा सकता है ^D, इसलिए पहला विकल्प 13 कीस्ट्रोक्स ( ^Dदो के रूप में गिना जाता है) में घटाया जाता है ।
एल। लेवेल

ठीक है, यह क्रियात्मकता के बारे में अधिक है; ;-)
स्टीफन किट

2
@ L.Levrel फ़ंक्शन के साथ यह सिर्फ c 1+1वह है जो मुझे चाहिए था! :-) (उत्तर को स्पष्ट करने के लिए अद्यतन किया गया है)
Fabby

और यदि आप फ्लोटिंग पॉइंट करते हैं: सी 'स्केल = 2; 17/3 '(या बेहतर,' c ') फंक्शन के अंदर इस्तेमाल होने वाले वैरिएबल का पैमाना है, और जब भी आपको n डिजीटल अंक होने की जरूरत हो, तो इसे परिभाषित करें। डिफॉल्ट 0. है।)
ओलिवियर डुलैक

1
बल्कि bc -lइसे और अधिक सक्षम बनाने के लिए फ़ंक्शन परिभाषा में उपयोग करें ।
आइजैक

22

खोल

सीएलआई में सबसे सरल कैल्क स्वयं सीएलआई (शेल) है (यदि IFSडिफ़ॉल्ट है):

$ echo $(( 22 + 333 ))
355

रिक्त स्थान छोड़ा जा सकता है:

$ echo $((22*333))
7326

चूंकि यह POSIX का हिस्सा है, लगभग सभी गोले इसमें हैं। और इसमें C भाषा गणित की अधिकांश कार्यक्षमता शामिल है (सिवाय इसके कि zsh में एक अलग ही मिसाल है, C_PRECEDENCES इसे संगत मूल्य पर पुनर्स्थापित करने के लिए सेट करें):

$ echo $((22*333^2))
7324

और कुछ शेल में अधिकांश सी भाषा गणित सिंटैक्स (अल्पविराम सहित) हैं:

$ echo $((a=22,b=333,c=a*b,c))
7326

लेकिन कुछ गोले में यह केवल पूर्णांक गणित है (और आमतौर पर वर्तमान ओएस में 2 63 से कम ):

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

कुछ गोले तैरते हुए गणित कर सकते थे:

$ ksh -c 'echo $((1234/3.0))'
411.333333333333333

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21

Zsh से बचें (zcalc में समान समस्याएं हैं):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259

मैं आपको बचने की सलाह देता हूं expr, कभी-कभी अजीब भागने की जरूरत होती है:

$ expr 22 \* 333
7326

बीसी

अगले स्तर पर ( POSIX भी ) bc(RPN का चचेरा भाई dc) है

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

dc था POSIX लेकिन 2017 में हटा दिया गया

यदि आपका शेल इसका समर्थन करता है, तो छोटा करें:

$ bc <<<'22*333'
7326

या और भी:

$ <<<'22*333' bc
7326

दोनों कुछ आंतरिक गणित कार्यों के साथ सटीक गणना करने वाले हैं:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749

awk

वास्तव में बुनियादी कैल्क उपकरण के बाद, आपको अन्य भाषाओं में जाने की आवश्यकता है

$ awk "BEGIN {print (22*33)/7}"
103.714

$ perl -E "say 22*33/7"
103.714285714286

$ python3 -c "print(22*33/7)"
103.71428571428571

$ php -r 'echo 22*33/7,"\n";'
103.71428571429

समारोह

आप उपरोक्त विकल्पों में से किसी एक कार्य को परिभाषित कर सकते हैं:

c () 
{ 
    local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
    gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}

और उपयोग करें:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714

20

इस पृष्ठ की टिप्पणियों को पढ़ते हुए , मुझे एक यूनिक्स / लिनक्स प्रोग्राम दिखाई देता है जिसे calcवह कहते हैं जो आप चाहते हैं। यदि डेबियन / उबंटू / डेरिवेटिव पर:

sudo apt-get install apcalc

तब आप कर सकते हो:

calc 236-192

और यदि आप alias c='calc'अपने .bashrcया किसी अन्य के लिए एक उपनाम जोड़ते हैं /etc/bash.bashrcतो यह बस हो जाता है:

c 1+1

कमांड लाइन पर।


1
परिपूर्ण नहीं है, लेकिन एक उत्थान के लिए काफी अच्छा है। अन्य उपयोगकर्ता द्वारा निकाली गई चैट और डाउनवोट में गलतफहमी को ठीक किया गया । मेरे अपने (हीन) उत्तर को नष्ट कर दिया ... ;-)
Fabby


9

यह unitsकार्यक्रम, जिसे कैलकुलेटर के रूप में उपयोग करने का इरादा नहीं है, वास्तव में एक के रूप में काफी अच्छी तरह से काम करता है।

$ units "236-192"
    Definition: 44
$ 

यदि अभिव्यक्ति में स्थान हैं, तो अभिव्यक्ति को उद्धरण-संरक्षित किया जाना चाहिए।
यह एक्सपोनेंशियल और कोष्ठक के गहरे घोंसले का समर्थन करता है


3
यह बहुमुखी है: units -t -d 10 "236GB - 192GB" GBआउटपुट 44, units -t -d 15 "236GB - 192GB" bytesआउटपुट 44000000000, आदि
4

6

जैसा कि पहले उत्तर में एक टिप्पणी में कहा गया था, मानक शेल (बीए) श भीतर अंकगणितीय अभिव्यक्तियों का मूल्यांकन करने की अनुमति देता है $((...))। मैं यह जांच नहीं सकता था कि यह POSIX मानक का हिस्सा है या नहीं, लेकिन मैंने जांच की कि यह Cygwin और Mingw32 शेल पर भी काम करता है।

करने के लिए देखने के परिणाम, आप वास्तव में टाइप करने के लिए होगा echo $((...)), जो (के इंटरैक्टिव उपयोग) की तुलना में कुछ अक्षर अधिक बनाता है bc। हालांकि, एक स्क्रिप्ट में परिणाम का उपयोग करने के लिए , यह संभवतः bcसमाधान से कम होगा (जो हो सकता है, जैसे, `echo ...|bc`)।

वर्बोसिटी के संबंध में, bcकमांड विकल्प -qको "सामान्य जीएनयू bcस्वागत" के आउटपुट को दबा देता है ।

अंतिम, थोड़ा सीमा रेखा टिप्पणी के रूप में, आइए ध्यान दें कि bcकेवल एक कैलकुलेटर नहीं है, बल्कि एक पूर्ण प्रोग्रामिंग भाषा है (उपयोगकर्ता परिभाषित कार्यों सहित, जबकि और छोरों आदि के लिए)। एक और तथ्य जो बाहरी कार्यक्रम के बजाय इस तरह की सरल गणना के लिए बिल्ड-इन अंकगणितीय क्षमताओं को पसंद करने का सुझाव देता है। कहा गया है कि दिए गए विभाजन संख्या (ओं) के लिए डेटा निकालना और "M", "G" प्रत्यय के साथ व्यवहार करना, जैसा कि मूल प्रश्न पूछने के लिए लग रहा था, शायद (g)awkइसके बजाय बुला सकता है bc

स्रोत: https://www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html


धन्यवाद! बहुत बढ़िया पहला जवाब! +1
फैबी

2
$((...))को अंकगणितीय विस्तार कहा जाता है और यह POSIX का हिस्सा है: pubs.opengroup.org/onlinepubs/9699919799/utilities/… मेरे लिए POSIX शेल की इस विशेषता का सबसे बड़ा दोष यह है कि यह केवल पूर्णांक अंकगणितीय का समर्थन करता है :(
pabouk

6

मैं zsh में क्या करता हूं:

$ <<< $(( 236 - 192 ))
44

बाश में, मुझे स्पष्ट रूप से बिल्ली का उल्लेख करना होगा:

$ cat <<< $(( 236 - 192 ))
44

अगर मैं परिणाम को अंश अंकों में शामिल करना चाहता था (कार्य में काम करता है, न कि बैश में), तो मैं ऑपरेंड में से किसी एक मूलांक को जोड़ूंगा।

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))बहुत काम करता है ;-)।
स्टीफन किट

Zsh से बचें: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259
इसहाक

@ इक्का कम से कम zsh बताता है कि यह छोटा है; बैश सिर्फ शिकायत किए बिना आपको गलत जवाब देता है।
स्टीफन किट

@StephenKitt zsh के साथ समस्या एक आउटपुट शो की तुलना में अधिक जटिल है। तुलना: zsh -c 'print $((12345678901234567890123 + 1))'और zsh -c 'print $((123456789012345678901 + 1))'। यह अलग-अलग लंबाई में छोटा है और विभिन्न संख्यात्मक परिणाम उत्पन्न कर रहा है।
इसहाक

@StephenKitt के बजाय बैश मैनुअल (और हस्ताक्षरित इंट के अतिप्रवाह के बारे में सी भाषा) का अनुसरण कर रहा है। ऐसा नहीं है कि मैं व्यक्तिगत रूप से इसे पसंद करता हूं, लेकिन इसे इस तरह से प्रलेखित किया गया है। कोशिश करो bash -c 'echo $((1<<63))'और `` बाश -c 'गूंज $ ((1 << 63) -1)) ``।
आइजैक

6

व्यक्तिगत रूप से, मैं की तरह libqalculate (के कमांड लाइन संस्करण Qalculate )।

$ qalc
> 236-192

  236 - 192 = 44

जबकि इंटरफ़ेस निश्चित रूप से सरल है, (lib) qalculate एक शक्तिशाली, पूर्ण विकसित कैलकुलेटर है। जैसे

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

यह आवश्यक होने पर टैब पूर्ण, ओपन / क्लोज कोष्ठक जैसी उपयोगी चीजें भी करता है और क्वेरी की अपनी व्याख्या को प्रिंट करता है।

> 18-2)/4

  (18 - 2) / 4 = 4

बाहर निकलने के लिए, मैं बस प्रेस Ctrl+ करता हूं d

और भी तेज़ पहुँच के लिए, इसे कुछ इस तरह सेट करें alias ca='qalc'


मैंने मैनुअल के टीओसी को पढ़ा, लेकिन सीएलआई के बारे में कुछ भी नहीं जान सका। (इस बीच में +1)
फेबी

1
धन्यवाद @ फैबी मैं भ्रमित हो गया, और सीएलआई हिस्सा वास्तव में थोड़ा अलग है। मैंने स्पष्ट करने के लिए उत्तर अपडेट किया है।
स्पार्कहॉक

काश मैं तुम्हें दो बार उखाड़ सकता! ;-)
फेबी

4

एक और टैब में पायथन खुला?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>

नहीं, वास्तव में, लेकिन वैसे भी एक साफ विचार नहीं है! :-) +1
फाबबी


1
@ फुकुव हाँ, लेकिन कोई भी पीएस को पसंद नहीं करता है
देव

3
@ यूनिक्स के टन लोगों को PS
phuclv

2

dc -e '236 192-p'

... बेशक, अगर आप परिचित नहीं हैं dcऔर आपको दो संख्याओं को घटाने से अधिक की आवश्यकता है, तो आप अधिक परिचित तरीकों के साथ बचत करने के लिए अधिक समय खोज रहे हैं dc(और शायद RPN सामान्य रूप से) का उपयोग करें।


हाँ, डेस्क कैलकुलेटर पर एक 3-मिनट की नज़र थी और जानता था कि यह मेरे लिए नहीं है: मैं एक टीआई था, न कि एक एचपी छात्र।
Fabby

2

यदि आपने ग्रेडेल स्थापित किया है तो आप ग्रूवी ...

यदि ग्रूवी को सही तरीके से रखा गया है, तो आपको इसका उपयोग करने में सक्षम होना चाहिए:

groovy -e "println 1+1"

यह अन्य सभी उदाहरणों के साथ थोड़ा बेमानी लग सकता है, लेकिन:

  • groovy एक शक्तिशाली भाषा है
  • संभवतः सबसे अच्छा पुस्तकालय समर्थन उपलब्ध है
  • शक्तिशाली और सरल गणित कार्य (जैसे सटीक गणित)
  • यह आउटपुट के लिए पुनर्निर्देशित स्टडआउट का उपयोग करता है, इसलिए यह आश्चर्यजनक रूप से लचीला है (बैकटिक्स `और इसी तरह की बैच फ़ाइलों के अंदर उपयोग करने के लिए महान)।

यदि आपके पास जावा स्थापित नहीं है, तो यह संभवतः ग्रूवी और जावा को स्थापित करने के लायक नहीं है - यदि ग्रोव पहले से ही उपलब्ध है तो यह सिर्फ एक विकल्प है।


नहीं, वास्तव में, लेकिन वैसे भी एक साफ विचार नहीं है! :-) +1
फाबबी

2

क्या आपने सहमति की कोशिश की है ?

विवरण: कंसोल कैलकुलेटर कॉन्सेप्ट लिनक्स कंसोल के लिए एक कैलकुलेटर है। यह एक साधारण सांत्वना कार्यक्रम में पैक किए गए extcalc का सिर्फ पार्सर-एल्गोरिथ्म है। यदि आपको अपने शेल में कैलकुलेटर की आवश्यकता है तो आप इसका उपयोग कर सकते हैं। कॉन्क्लैक सी-लाइक प्रोग्रामिंग लैंग्वेज में लिखी गई स्क्रिप्ट को चलाने में सक्षम है।

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

इसके साथ स्थापित करें:

sudo apt-get install concalc

1
सबूत ... graag gedaan ... :-D
Fabby

2

इससे पहले कि कोई अन्य शानदार उत्तर पोस्ट किया जाता, मैंने स्क्रिप्ट को बनाना समाप्त कर दिया /usr/local/bin/c:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

इसलिए: टाइपिंग c 1+1पैदावार 2! :-)

नोट 1: मैंने इस्तेमाल किया cक्योंकि वह कमांड किसी भी यूनिक्स सिस्टम पर मौजूद नहीं है जो मुझे मिल सकता है। यदि आप अपने सी संकलक के लिए कहा जाता है, कुछ और है कि कम है और आप का उपयोग नहीं करते का उपयोग करें।
नोट 2: स्रोत


1
(1) echo "$*" | bc -lआपके द्वारा उपयोग किए गए शेलबैंग के रूप में उपयोग करने का निर्णय लिया गया है /bin/shऔर मुझे नहीं पता कि आपके पास ksh / bash / zsh उपलब्ध है। (2) ध्यान दें कि आप गणना के पैमाने को बदल सकते हैं, उदाहरण के लिए, आप 'c' स्केल = 60; 777/333 'पर अमल करते हैं। आशा है कि यह
आइज़ैक

1

यदि अजगर स्थापित है, तो आप कमांड लाइन के माध्यम से बहुत सारे गणितीय ऑपरेशन कर सकते हैं। मैंने नीचे कुछ उदाहरण देने की कोशिश की।

मैंने इस्तेमाल किया है python3आप उपयोग कर सकते हैं python। के बीच का अंतर pythonऔर python3होते हैं, जब विभाजित (आंशिक) आपरेशन होते हैं, से बचने के लिए इस मुद्दे को नीचे देखें अजगर python3 बनाम

नोट: नवीनतम सभी linux dist, Python 2.7 और Python 3.5 दोनों के साथ डिफ़ॉल्ट रूप से आता है। मामले में अगर अजगर स्थापित करने की आवश्यकता है तो यहां क्लिक करें

जोड़ें, घटाना, गुणा और भाग करें:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

मापांक-मंडल का विभाजन:

$ python3 <<< "print(14%3)"
2

मंजिल विभाजन:

$ python3 <<< "print(14//3)"
4

घातांक - x से y की शक्ति (x ^ y):

$ python3 <<< "print(3**2)"
9

वर्गमूल (पूर्व: √4 = 2):

$ python3 <<< "print(4**0.5)"
2

अधिक वैज्ञानिक भाग, आपको गणित पुस्तकालय आयात करने की आवश्यकता होगी । उदाहरण के लिए:

एक्स = लॉग (एक्स) का प्राकृतिक लघुगणक:

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

X = log10 (x) का आधार -10 लघुगणक:

$ python3 <<< "import math; print(math.log10(10))"
1.0

फैक्टरियल (पूर्व: 3! = 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

Trigonometry- sin(x), cos(x), tan(x):

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

अधिक गणित से संबंधित कार्य यहां देखें

pythonबनाम python3:

- विभाजित करें: (फ्लोट का उपयोग करें):

$ python <<< "print(10.0/3)"
3.33333333333

-के बजाय

$ python <<< "print(10/3)"
3

इसके अलावा आप प्रत्यक्ष टर्मिनल का उपयोग कर सकते हैं:

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

बस। हैप्पी कोडिंग!


0

या तो bcया qalc


स्वचालित रूप से bcहमेशा दो अंकों के लिए गोलाई होती है: (इसके साथ चलना -lदिन के सामान के लिए बुरा है)

अपना संपादित करें ~/.bashrc:

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

एक नया खोल खोलें और bcवहां दौड़ें ।


-1

एक-लाइनर बनाना:

$ c () { echo $(( ${1} )) }

अब आप साधारण पूर्णांक गणित का उपयोग कर सकते हैं:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

इसहाक के जवाब में यह पहले से ही चर्चा में है ।
स्टीफन किट

@StephenKitt हां मैंने इसहाक के बहुत विस्तृत जवाब को उकेरा। मैंने सोचा कि एक-एक लाइनर ने जो कुछ पोस्ट किया है, वह संक्षेप में उपयोगी होगा। ${1}पैरामीटर उपयोग सभी प्रश्नों के उत्तर के लिए अद्वितीय है।
विनयुनुच्स

2
मैं आपको उन कारणों पर गौर करने के लिए प्रोत्साहित करता हूं जो अन्य जवाबों का उपयोग नहीं करते ${1};-)
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.