दंश में पूर्णांक के लिए तर्क स्ट्रिंग


73

अंकगणित करने के लिए किसी तर्क को पूर्णांक में बदलने का तरीका जानने की कोशिश करना, और फिर उसे प्रिंट करना, इसके लिए कहें addOne.sh:

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1

मैं आपके प्रश्न को प्रारूपित करने की कोशिश करता हूं, लेकिन यह किसी भी तरह अस्पष्ट है। printf "1 + %s\n" $1 won't do ?
अर्केमियर

जवाबों:


87

बैश में, कोई "एक तर्क को पूर्णांक में अंकगणित करने के लिए परिवर्तित नहीं करता है"। बैश में, चर को संदर्भ के आधार पर पूर्णांक या स्ट्रिंग के रूप में माना जाता है।

अंकगणित करने के लिए, आपको अंकगणित विस्तार संचालक का आह्वान करना चाहिए $((...))। उदाहरण के लिए:

$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3

या आम तौर पर पसंद किया जाता है:

$ echo "$((a + 1))"
3

आपको पता होना चाहिए कि bash (ksh93, zsh या यश के विपरीत) केवल पूर्णांक अंकगणित करता है । यदि आपके पास फ़्लोटिंग पॉइंट नंबर (दशमलव के साथ संख्याएँ) हैं, तो सहायता के लिए अन्य उपकरण हैं। उदाहरण के लिए, उपयोग करें bc:

$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14

या आप बैश के बजाय फ्लोटिंग पॉइंट अंकगणितीय समर्थन वाले शेल का उपयोग कर सकते हैं:

zsh> echo $((3.14 + 1))
4.14

यदि आप नहीं जानते कि तार क्या हैं (उपयोगकर्ता इनपुट की तरह) तो $ () ()) या (()) का उपयोग करना असुरक्षित है। इस पर विचार करें: foo = foo ((foo + = 0)) यह स्क्रिप्ट को क्रैश कर देगा क्योंकि यह फू का पुनर्मूल्यांकन करने की कोशिश करता है। उसी के साथ: foo = foo foo = $ ((foo + 0))
कला

12

अन्य तरीके से, आप उपयोग कर सकते हैं expr

उदाहरण के लिए:

$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3

10

में bash, आप प्रिंटफ -v का उपयोग करके किसी भी चीज को पूर्णांक में परिवर्तित कर सकते हैं :

printf -v int '%d\n' "$1" 2>/dev/null

फ्लोटिंग नंबर को पूर्णांक में बदल दिया जाएगा, जबकि कुछ भी ऐसा नहीं है जैसे कि नंबर को 0. में बदल दिया जाएगा। e

उदाहरण:

$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1

2
इसके बिना अन्य गोले में printf -vकमांड प्रतिस्थापन के साथ प्राप्त किया जा सकता है:int="$(printf '%d' 123.123 2>/dev/null)"
एड्रियन गंटर

2
यह काम नहीं आता है।
माइकल मार्टिनेज

@MichaelMartinez क्या आप सुनिश्चित हैं? आपके किस संस्करण का bashउपयोग किया गया है?
कोउंगलम

GNU बैश, संस्करण 4.2.46 (1) -release (x86_64-redhat-linux-gnu)
माइकल मार्टिनेज

5

हाल ही में लिनक्स और OSX वातावरण दोनों में चलने के लिए बैश स्क्रिप्ट विकसित करते समय एक समान स्थिति सामने आई। OSX में एक कमांड के परिणाम में परिणाम कोड वाला एक स्ट्रिंग लौटा; यानी, " 0"। बेशक, यह निम्नलिखित मामले में सही ढंग से परीक्षण करने में विफल रहा:

if [[ $targetCnt != 0 ]]; then...

समाधान को पूर्णांक के रूप में लागू करना था (यानी, 'कन्वर्ट') परिणाम के समान, जो @ जॉन 1024 ने ऊपर उत्तर दिया, ताकि यह अपेक्षित रूप से काम करे:

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...

3
==आदि [[( [उर्फ test) भी स्ट्रिंग तुलना करते हैं। अंकगणितीय तुलना जैसे विभिन्न संचालक हैं [[ $targetcnt -ne 0 ]]; सशर्त अभिव्यक्तियों के तहत मैनपेज (या जानकारी) देखें। विशेष रूप से रिक्त स्थान को ट्रिम करने के लिए, आप डिफ़ॉल्ट वर्डप्लेटिंग (में नहीं किया गया ) प्राप्त करने के लिए निर्विवाद [चर विस्तार के साथ उपयोग कर सकते हैं लेकिन सामान्य तौर पर यह दृष्टिकोण आपको खतरे में ले जाता है। [ $targetcnt == 0 ][[
dave_thompson_085

-2

रंग कोड के बारे में देखभाल, यहां तक ​​कि ट्रेस में ( -x) वे दिखाई नहीं देंगे, जो इसे दूर करेगा वह यह है कि जिस स्ट्रिंग को एक संख्या माना जाता है वह उद्धरण में लिपटे हुए है चाहे आप इसे कैसे प्रिंट करें।


1
नीचे वोट दिया गया है, क्योंकि मुझे आपका उत्तर थोड़ा अस्पष्ट है। शायद आप जोड़ सकते हैं कि स्क्रिप्ट को क्या सुधारना चाहिए?
4

यह बैश + पूर्णांक + स्ट्रिंग की खोज में शीर्ष उत्तर था, इसलिए मैंने इससे संबंधित जानकारी का एक टुकड़ा जोड़ा, जो उत्तरों में शामिल नहीं था, अर्थात जब तारों को रंगों के कोड में लपेटा जाता है, तो यह अस्पष्ट हो सकता है कि संचालन जैसे $((var+var))असफल भी क्यों न हों हालांकि अगर आप echoया printfदोनों संस्करण वे समान हैं। मुझे पता नहीं है कि चूंकि मैं केवल आउटपुट के स्रोत पर रंग कोड अक्षम करके इसे ठीक करने में सक्षम था। ट्रेस लॉग में इसे देखने के लिए आप var='0'var=0
अपकमिंग

आप क्या कर सकते यकीन है कि उत्पादन के साथ रंग कोड नहीं है बनाते हैं sedयदि आप इसे निष्क्रिय नहीं कर सकते
untore
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.