বাশ ফাংশন ব্যবহার করে কমান্ড লাইনে সাধারণ গণিত করা: $ 1 দ্বারা 2 বিভক্ত (সম্ভবত বিসি ব্যবহার করে)


33

কখনও কখনও আমি অন্য একটি সংখ্যা বিভক্ত করা প্রয়োজন। এটির জন্য যদি আমি কেবল এটির জন্য একটি বাশ ফাংশনটি সংজ্ঞায়িত করতে পারি তবে দুর্দান্ত হবে। এখনও অবধি আমি মত প্রকাশ করতে বাধ্য হচ্ছি

echo 'scale=25;65320/670' | bc

তবে দুর্দান্ত লাগবে যদি আমি .bashrc ফাংশনটি দেখতে পছন্দ করি তবে এটি সংজ্ঞায়িত করতে পারি

divide () {
  bc -d $1 / $2
}

উত্তর:


45

আমার কাছে একটি সহজ ব্যাশ ফাংশন রয়েছে calc:

calc () {
    bc -l <<< "$@"
}

ব্যবহারের উদাহরণ:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

আপনি নিজের অনুসারে এটি পরিবর্তন করতে পারেন। উদাহরণ স্বরূপ:

divide() {
    bc -l <<< "$1/$2"
}

দ্রষ্টব্য: <<< এখানে একটি স্ট্রিং যা স্টিডিনে খাওয়ানো হয় bc। আপনার কাছে প্রার্থনা করার দরকার নেই echo


3
আমি সম্মত হই যে অতিরিক্ত প্রতিধ্বনি thrownোকানো ছাড়া এটি আরও ভাল দেখায়, তবে এটি শেল অন্তর্নির্মিত হওয়ায় এটি কোনও অতিরিক্ত ব্যয় ছাড়াই আসে। শেল ফাংশনগুলিতে আমাকে '<<<' ব্যবহার করা থেকে বিরত রাখার বিষয়টি সীমাবদ্ধতা, অন্যদিকে অতিরিক্ত প্রতিধ্বনি এটিকে মূল বোর্ন শেল বা ksh এ পরিবর্তন ছাড়াই ব্যবহার করতে দেয়।
তাতজানা হিউসার

@ তাতজানা হিউসার ksh, 93-রূপটি এখানে-স্ট্রিংগুলিকে সমর্থন করে।
কুসালানন্দ

কোনও ভেরিয়েবলকে নিয়োগের জন্য, আমি এটি করেছি: foo = $ (বিসি-এল <<< "(2 * 5) + 5")
thebiggestlebowski

20

বাশ গণিত নিজেই কিছুটা করতে পারে। এটি যথাযথতার জন্য কার্যকর নয়, যদিও এটি ঘুরছে।

[user]$ echo $(( 10/5 ))
2

তবে আপনি ঠিক বলেছেন - বাশ ফাংশনটি একটি সাধারণ শর্টকাট হতে পারে এবং আপনার উদাহরণটি মূলত কাজ করে।

divide() {
  echo "scale=25;$1/$2" | bc
}

আপনার .bashrc এ ফেলে দিন এবং তারপরে আপনি এটি করতে পারেন:

[user]$ divide 10 5
2.0000000000000000000000000

1
echo $((10 / 5))কোন উদ্ধৃতি প্রয়োজন।
ব্যবহারকারীর অজানা

1
গুরুত্বপূর্ণ বিরক্তি: echo $((6383/7671)) আপনাকে শূন্য দেবে। আপনার ভাসমান পয়েন্ট সংখ্যাগুলি সম্পর্কে স্পষ্ট হওয়া দরকার:echo $((6383.0/7671.0))
শ্রীধর সারনোবাত

9

আপনি সম্ভবত বাশ অন্তর্নির্মিত 'এক্সপ্রেস' হিসাবে জানেন

$ expr 60 / 5
12

যা পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ এবং আর্গুমেন্টগুলির মধ্যে ফাঁকা স্থানগুলির প্রয়োজন।

আপনি ইতিমধ্যে যে ইকো এক্সপ্রেশনটি ব্যবহার করছেন তার লাইনের পাশাপাশি কোনও ফাংশন সংজ্ঞায়িত করা থেকে আপনি কী বাধা দিচ্ছেন? অর্থাত

 divide () {
   echo $1/$2 | bc
 }

1
শুধু অজ্ঞতা। আমি বুঝতে পারি না যে আমি এটি
সেভাবেই

7

এই সুনির্দিষ্ট প্রশ্নের উত্তর আসলেই নয়, তবে এটি জেনে রাখা ভাল। zsh;-) ব্যবহার করুন

% echo $((65320./670))
97.492537313432834

আমি আসলে এই প্রশ্নটি খুঁজছিলাম কারণ আমি zsh এ পরিবর্তন করেছি এবং বাশের বিল্টিন ব্যবহার করতে পারি না expr, তাই ভাল উত্তর যাই হোক না কেন :)
স্টেইন শ্যাট

2

আপনি যদি calcআপনার সিস্টেমে ইনস্টল করে থাকেন এবং আপনি রাউন্ডিং পছন্দ করেন না তবে আপনি এটি করতে পারেন:

div() { calc "$1 / $2"; }

হুম ... 'ক্যালক' এর জন্য কোনও
ডিবিয়ান

প্যাকেজটি বলা হয় apcalc (সালিসি যথার্থতা) ... বাইনারি বলা হয়calc
পিটার.ও

@ পিটার.ও ঠিক আছে, আর্চ লিনাক্সের রেপোতে এটি বলা হয় calc

2

ছোট মূল্যবোধের জন্য একটি নোংরা হ্যাক এবং বিসি ব্যবহার না করেই সীমাবদ্ধ নির্ভুলতা হ'ল সঠিক ফলাফল পেতে বিভাগীয় হওয়ার আগে মনোনীতকে গুণ করা।

নির্ভুলতা ছাড়াই উদাহরণ:

echo $((13/7)) 
1

এবং 2 অঙ্কের নির্ভুলতা সহ: 100 দ্বারা গুণিত করুন এবং দশমিক পয়েন্ট 2 ধাপে বাম দিকে সরান:

echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%

এটি কেবল তখনই কার্যকর যদি সংখ্যার ব্যাপ্তি আগে জানা থাকে এবং যথার্থতা সর্বদা একই থাকে। কলে এড়ানো BC , এবং কলিং sed খুব যুক্তিসঙ্গত না বলে মনে হয়।

দ্রষ্টব্য, মানগুলি গুন করা ওভারফ্লো ত্রুটির দিকে পরিচালিত করতে পারে তবে খুব তাড়াতাড়ি নয়:

echo $((1000000000*12345678901))
-6101065172709551616

গণিতের এক্সপ্রেশনগুলি মূল্যায়নের জন্য ডাবল বন্ধনী ব্যবহার করা হ্রাস করা হয়। ব্যবহার করুন: $[expression]পরিবর্তে
laebshade

3
@ লেলেবশেদ: আমি আপনাকে ভুল প্রমাণ করতে পারি, বিপরীতটি সত্য। এখানে বাশ ম্যানুয়ালটির একটি উদ্ধৃতি দেওয়া আছে:The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
ব্যবহারকারী অজানা

এখানে ,  এখানে  এবং  এখানেও আলোচনা করা হয়েছে
জি-ম্যান

0

বিসি ব্যবহারের পরিবর্তে, আপনি awk ব্যবহার করতে পারেন:

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }

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