मैं लिनक्स शेल में चर के साथ विभाजन कैसे कर सकता हूं?


136

जब मैं नीचे के रूप में अपने शेल में कमांड चलाता हूं, तो यह एक रिटर्न देता है expr: non-integer argument त्रुटि । क्या कोई मुझसे इसकी व्याख्या करेगा?

$ x=20
$ y=5
$ expr x / y 
expr: non-integer argument

4
@ShivanRaptor हालांकि कोई यह तर्क दे सकता है कि सवाल RTFM प्रश्न है, यह निश्चित रूप से एक वैध शेल प्रोग्रामिंग प्रश्न है। यह भाषाओं से आने वाले लोगों के लिए भी एक उचित प्रश्न है, जिनके लिए डेरेफ़रिंग (उदाहरण के लिए रूबी या जावास्क्रिप्ट) की आवश्यकता नहीं है। इसे खुला छोड़ देना चाहिए।
टॉड ए। जैकब्स

6
@ शिवनप्टर नहीं, यह यहाँ विषय पर है। यह बाश में प्रोग्रामिंग के बारे में है। यूनिक्स / लिनक्स मुख्य रूप से सिस्टम का उपयोग करने के लिए है, प्रोग्रामिंग के लिए नहीं। अब, शेल स्क्रिप्टिंग प्रोग्रामिंग और सिस्टम का उपयोग करने के बीच की सीमा को पूरा करता है, इसलिए यह किसी भी साइट पर विषय पर हो सकता है। यदि "मैं कैसे नेटवर्किंग स्थापित करूं" के बारे में एक सवाल था, तो यह निश्चित रूप से यूनिक्स / लिनक्स पर होगा। यदि यह बैश में इंटरैक्टिव कीबाइंडिंग के बारे में एक प्रश्न था, तो यह भी वहां से संबंधित होगा। लेकिन शेल स्क्रिप्टिंग के बारे में एक सवाल निश्चित रूप से यहाँ और साथ ही विषय पर भी है।
ब्रायन कैंपबेल

मेरा जवाब यहां देखें, जो कि शेल से पाइथन को कॉल करने के लिए (फ्लोट में इंट को कन्वर्ट करने के लिए ...) का उपयोग करके, $ BASH वैरिएबल के घटाव और विभाजन को दिखाता है: stackoverflow.com/questions/8385627/…
विक्टोरिया

जवाबों:


195

वे चर शैल चर हैं। उन्हें दूसरे प्रोग्राम ( यानी expr ) के मापदंडों के रूप में विस्तारित करने के लिए , आपको $उपसर्ग का उपयोग करने की आवश्यकता है :

expr $x / $y

कारण यह शिकायत की है क्योंकि यह सोचा था कि आप वर्णमाला वर्ण ( यानी गैर पूर्णांक) पर काम करने की कोशिश कर रहे थे

यदि आप बैश शेल का उपयोग कर रहे हैं, तो आप अभिव्यक्ति सिंटैक्स का उपयोग करके समान परिणाम प्राप्त कर सकते हैं:

echo $((x / y))

या:

z=$((x / y))
echo $z

1
आप बैश के लिए मैन-पेज के माध्यम से पढ़कर बहुत कुछ पता कर सकते हैं। man bashप्रॉम्प्ट पर ( qबाहर निकलने के लिए) टाइप करें
धान

62
यह इस पृष्ठ पर कहीं नोट किया जाना चाहिए कि अधिकांश (यदि सभी नहीं) जीएनयू / लिनक्स गोले केवल पूर्णांक संचालन करते हैं
स्किप्पी ले ग्रैंड गौरौ

35

मेरा मानना ​​है कि यह पहले से ही अन्य थ्रेड्स में उल्लिखित था:

calc(){ awk "BEGIN { print "$*" }"; }

तो आप बस टाइप कर सकते हैं:

calc 7.5/3.2
  2.34375

आपके मामले में यह होगा:

x=20; y=3;
calc $x/$y

या यदि आप चाहें, तो इसे एक अलग स्क्रिप्ट के रूप में जोड़ें और इसे $ PATH में उपलब्ध कराएँ ताकि आपके पास हमेशा यह आपके स्थानीय शेल में हो:

#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }

4
आप इसका उपयोग भी कर सकते हैंecho '1 / 3' | bc -l
यूजीन

19

का उपयोग क्यों नहीं करते हैं; मुझे यह बहुत आसान लगता है। यहां एक उदाहरण आपको उपयोगी मिल सकता है:

start=`date +%s`
# ... do something that takes a while ...
sleep 71

end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds

एक और सरल उदाहरण - 1970 के बाद के दिनों की संख्या:

let days=$(date +%s)/86400

15

बैश वेरिएबल्स को संदर्भित करने के लिए पैरामीटर विस्तार की आवश्यकता होती है

अधिकांश लिनक्स वितरणों पर डिफ़ॉल्ट शेल बैश है। बैश में, चर को पैरामीटर विस्तार के लिए एक डॉलर चिह्न उपसर्ग का उपयोग करना चाहिए । उदाहरण के लिए:

x=20
y=5
expr $x / $y

बेशक, बैश में अंकगणित ऑपरेटर और एक विशेष अंकगणितीय विस्तार वाक्यविन्यास भी है , इसलिए एक्सपायर बाइनरी को एक अलग प्रक्रिया के रूप में आमंत्रित करने की कोई आवश्यकता नहीं है। आप शेल को इस तरह से सभी काम करने दे सकते हैं:

x=20; y=5
echo $((x / y))

देखें अंकगणित विस्तार और शैल अंकगणित बैश संदर्भ सभी रक्तमय जानकारी के लिए नियम-पुस्तक में।
टॉड ए। जैकब्स

1
इस के साथ कोई संबंध नहीं है अपसंदर्भन लेकिन interpolating और expr2013 में हतोत्साहित किया जाता है
गाइल्स Quenot

@sputnick आप स्पष्ट रूप से भ्रमित हैं। कृपया एक शब्दकोश से परामर्श करने के लिए स्वतंत्र महसूस करें। देखें भिन्नता और लगाना
टॉड ए। जैकब्स

1
एक बेहतर शब्द का विस्तार हो रहा है , लेकिन डीफ्रेंसिंग नहीं । जब हम पॉइंटर्स का उपयोग करते हैं, तो डेरेफेरिंग का उपयोग किया जाता है, यहाँ ऐसा नहीं है, बस सरल चर है।
गिलेस क्वांट

1
@Prashant: tashp को बैश दुनिया में एक अच्छा संदर्भ नहीं माना जाता है।
गिलेस क्वॉन्ट

1

चलो मान लेते हैं

x=50
y=5

फिर

z=$((x/y))

यह ठीक से काम करेगा। लेकिन अगर आप केस स्टेटमेंट में इसका उपयोग करना चाहते हैं तो इसे हल नहीं कर सकते। यहाँ कोड दर्ज करें उस मामले में, div या devide या कुछ और जैसे सरल तार का उपयोग करें। कोड देखें


ये गलत है। /शेल-केस लेबल के रूप में ठीक काम करता है। जो काम नहीं करता है *, उसे उद्धृत किए बिना गुणा करने के लिए उपयोग करना है, जो कि आपने वास्तव में किया था; कि कारणों यह प्रभावी रूप से मामला है, जो अपने उदाहरण में है में सभी निम्न आइटम ओवरराइड करने के लिए 'विभाजित' और 'सापेक्ष'
dave_thompson_085

0

दशमलव बिंदु के बाद संख्या प्राप्त करने के लिए, आप यह कर सकते हैं: -

read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.