अंकगणित करने के लिए किसी तर्क को पूर्णांक में बदलने का तरीका जानने की कोशिश करना, और फिर उसे प्रिंट करना, इसके लिए कहें addOne.sh:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
अंकगणित करने के लिए किसी तर्क को पूर्णांक में बदलने का तरीका जानने की कोशिश करना, और फिर उसे प्रिंट करना, इसके लिए कहें addOne.sh:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
जवाबों:
बैश में, कोई "एक तर्क को पूर्णांक में अंकगणित करने के लिए परिवर्तित नहीं करता है"। बैश में, चर को संदर्भ के आधार पर पूर्णांक या स्ट्रिंग के रूप में माना जाता है।
अंकगणित करने के लिए, आपको अंकगणित विस्तार संचालक का आह्वान करना चाहिए $((...))। उदाहरण के लिए:
$ 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
में 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
printf -vकमांड प्रतिस्थापन के साथ प्राप्त किया जा सकता है:int="$(printf '%d' 123.123 2>/dev/null)"
bashउपयोग किया गया है?
हाल ही में लिनक्स और OSX वातावरण दोनों में चलने के लिए बैश स्क्रिप्ट विकसित करते समय एक समान स्थिति सामने आई। OSX में एक कमांड के परिणाम में परिणाम कोड वाला एक स्ट्रिंग लौटा; यानी, " 0"। बेशक, यह निम्नलिखित मामले में सही ढंग से परीक्षण करने में विफल रहा:
if [[ $targetCnt != 0 ]]; then...
समाधान को पूर्णांक के रूप में लागू करना था (यानी, 'कन्वर्ट') परिणाम के समान, जो @ जॉन 1024 ने ऊपर उत्तर दिया, ताकि यह अपेक्षित रूप से काम करे:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==आदि [[( [उर्फ test) भी स्ट्रिंग तुलना करते हैं। अंकगणितीय तुलना जैसे विभिन्न संचालक हैं [[ $targetcnt -ne 0 ]]; सशर्त अभिव्यक्तियों के तहत मैनपेज (या जानकारी) देखें। विशेष रूप से रिक्त स्थान को ट्रिम करने के लिए, आप डिफ़ॉल्ट वर्डप्लेटिंग (में नहीं किया गया ) प्राप्त करने के लिए निर्विवाद [चर विस्तार के साथ उपयोग कर सकते हैं लेकिन सामान्य तौर पर यह दृष्टिकोण आपको खतरे में ले जाता है। [ $targetcnt == 0 ][[
रंग कोड के बारे में देखभाल, यहां तक कि ट्रेस में ( -x) वे दिखाई नहीं देंगे, जो इसे दूर करेगा वह यह है कि जिस स्ट्रिंग को एक संख्या माना जाता है वह उद्धरण में लिपटे हुए है चाहे आप इसे कैसे प्रिंट करें।
$((var+var))असफल भी क्यों न हों हालांकि अगर आप echoया printfदोनों संस्करण वे समान हैं। मुझे पता नहीं है कि चूंकि मैं केवल आउटपुट के स्रोत पर रंग कोड अक्षम करके इसे ठीक करने में सक्षम था। ट्रेस लॉग में इसे देखने के लिए आप var='0'var=0
sedयदि आप इसे निष्क्रिय नहीं कर सकते
printf "1 + %s\n" $1 won't do ?