আমি একটি লিনাক্স শেলের ভেরিয়েবলগুলির সাথে কীভাবে বিভাগ করব?


136

আমি যখন নীচে হিসাবে আমার শেলের কমান্ডগুলি চালিত করি, এটি expr: non-integer argumentত্রুটি প্রদান করে। কেউ আমাকে এই ব্যাখ্যা করুন পারি?

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

4
@ শিভানর্যাপ্টর যখন কেউ যুক্তি দিতে পারেন যে প্রশ্নটি আরটিএফএম প্রশ্ন, তবে এটি অবশ্যই একটি বৈধ শেল প্রোগ্রামিং প্রশ্ন। এটি এমন ভাষা থেকে আসা কারও পক্ষে যুক্তিসঙ্গত প্রশ্ন যা ডেরেফারেন্সিংয়ের প্রয়োজন হয় না (যেমন রুবি বা জাভাস্ক্রিপ্ট)। এটি খোলা রেখে দেওয়া উচিত।
টড এ। জ্যাকবস

6
@ শিভানর্যাপ্টর নো, এটি এখানে বিষয়বস্তু। এটা বাশ প্রোগ্রামিং সম্পর্কে। ইউনিক্স / লিনাক্স মূলত সিস্টেমটি ব্যবহারের জন্য, প্রোগ্রামিংয়ের জন্য নয়। এখন, শেল স্ক্রিপ্টিং প্রোগ্রামিং এবং সিস্টেম ব্যবহারের মধ্যে সীমানা বিস্তৃত করে, সুতরাং এটি কোনও সাইটে বিষয় হতে পারে। "আমি কীভাবে নেটওয়ার্কিং সেটআপ করব" সম্পর্কে যদি কোনও প্রশ্ন থাকে তবে তা অবশ্যই ইউনিক্স / লিনাক্সের অন্তর্ভুক্ত। যদি এটি বাশ-এর ​​ইন্টারেক্টিভ কী-বাইন্ডিংগুলি সম্পর্কে কোনও প্রশ্ন হয়ে থাকে তবে তাও সেখানে অন্তর্ভুক্ত থাকবে। তবে শেল স্ক্রিপ্টিং সম্পর্কে একটি প্রশ্ন অবশ্যই এখানে এবং সেই সাথে এখানেও বিষয়টিতে রয়েছে।
ব্রায়ান ক্যাম্পবেল

আমার উত্তরটি এখানে দেখুন, যেটি শেল থেকে পাইথনকে কল ব্যবহার করে (ইনট ফ্লোটে রূপান্তর করতে ...) স্ট্যাকওভারফ্লো
ভিক্টোরিয়া স্টুয়ার্ট

উত্তর:


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
এই সঙ্গে কিছুই করার আছে dereferencing কিন্তু প্রক্ষেপক এবং expr2013 সালে নিরুৎসাহিত করা হয়
গিলেজ Quenot

@ Sputnick আপনি স্পষ্টভাবে বিভ্রান্ত একটি অভিধান পরামর্শ বিনা দ্বিধায় দয়া করে। দেখুন ডি-রেফারেন্স এবং প্রবেশ করান
টড এ জ্যাকবস

1
একটি ভাল শব্দ প্রসারিত হয় , কিন্তু dereferences না । আমরা যখন পয়েন্টার ব্যবহার করি তখন ডেরেফারেন্সিং ব্যবহার করা হয় , এটি এখানে সহজ নয়, এটি কেবল সহজ ভেরিয়েবল।
গিলস কুইনট

1
@ প্রশান্ত: tldp বাশ বিশ্বে ভাল রেফারেন্স হিসাবে পরিচিত নয়।
গিলস কুইনট

1

ধরা যাক

x=50
y=5

তারপর

z=$((x/y))

এটি সঠিকভাবে কাজ করবে। তবে আপনি যদি বিবৃতিতে / অপারেটর ব্যবহার করতে চান তবে এটি সমাধান করতে পারে না। এখানে কোড লিখুন সেক্ষেত্রে ডিভ বা ডিভাইড বা অন্য কোনও কিছুর মতো সরল স্ট্রিং ব্যবহার করুন। কোড দেখুন


এটা ভুল. /শেল-কেস লেবেল হিসাবে সূক্ষ্মভাবে কাজ করে। যা কাজ করে না তা হ'ল *উদ্ধৃতি ব্যতীত গুণনের জন্য ব্যবহার করা, এটি হতে পারে যা আপনি আসলে করেছিলেন; যে কারণগুলো এটা কার্যকরভাবে মামলা, যা আপনার উদাহরণে হয় সমস্ত নিম্নোক্ত আইটেমগুলি ওভাররাইড করতে 'devide' এবং 'মডিউল'
dave_thompson_085

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.