উত্তর:
এই সমস্তই পাটিগণিতের সাথে লেনদেন করে তবে বিভিন্ন উপায়ে এবং পরিবর্তনশীলটি বিভিন্ন উপায়ে তৈরি করা হয়। এর মধ্যে কয়েকটি bashশাঁসের জন্য নির্দিষ্ট , অন্যগুলি না হলেও।
$((...))বলা হয় গাণিতিক সম্প্রসারণ , যা সাধারণত হয় bashএবং kshশাঁস। এটি সাধারণ পূর্ণসংখ্যার গাণিতিক করার অনুমতি দেয় , যদিও কোনও ভাসমান পয়েন্ট স্টাফ নেই। অভিব্যক্তির ফলাফলটি প্রকাশের পরিবর্তে, যেমনটি echo $((1+1))হয়ে উঠতecho 2((...))পাটিগণিত মূল্যায়ন হিসাবে উল্লেখ করা হয় এবং অংশ if ((...)); thenবা while ((...)) ; doবিবৃতি হিসাবে ব্যবহার করা যেতে পারে । পাটিগণিত সম্প্রসারণ সম্প্রসারণ $((..))অপারেশনের আউটপুটকে প্রতিস্থাপন করে এবং হিসাবে ভেরিয়েবল নির্ধারণ i=$((i+1))করতে ব্যবহৃত হতে পারে তবে শর্তাধীন বিবৃতিতে ব্যবহার করা যায় না।$[...] পাটিগণিতের বিস্তারের জন্য পুরানো বাক্য গঠন যা অবনতিহীন। এছাড়াও দেখুন । পুরানো bashস্ক্রিপ্টগুলি যাতে না ভাঙে তাই এটি সম্ভবত রাখা হয়েছিল । এটি এতে কাজ করে নি ksh93, সুতরাং আমার অনুমান যে এই সিনট্যাক্সটি ব্যাশ-নির্দিষ্ট। দ্রষ্টব্য : স্পেসগুলি এখানে খুব গুরুত্বপূর্ণ; $[1+1]মত জিনিস সঙ্গে বিভ্রান্ত করবেন না [ $a -eq $b ]। [ব্যবধান সহ হিসাবে পরিচিত হয় testকমান্ড, এবং আপনি সাধারণত সিদ্ধান্ত গ্রহণের অংশে এটি দেখতে। এটি আচরণ এবং উদ্দেশ্যগুলির মধ্যে খুব আলাদা।letএকটি bashএবং kshকীওয়ার্ড যা সাধারণ গাণিতিক মূল্যায়নের মাধ্যমে পরিবর্তনশীল তৈরির অনুমতি দেয়। আপনি যদি সেখানে কোনও স্ট্রিং নির্ধারণের চেষ্টা করেন তবে আপনি let a="hello world"একটি সিনট্যাক্স ত্রুটি পাবেন। কাজ করে bashএবং ksh93।$(...)হ'ল কমান্ড প্রতিস্থাপন, যেখানে আপনি আক্ষরিক অর্থে একটি কমান্ডের আউটপুট নেন এবং একটি ভেরিয়েবলকে বরাদ্দ করেন। আপনার কমান্ডটি এখানে expr, যা অবস্থানগত তর্কগুলি যেমন গ্রহণ করে expr arg1 arg2 arg3, তাই স্পেসগুলি গুরুত্বপূর্ণ। এটি ধরণের গণিতের জন্য একটি ছোট কমান্ড-লাইন ক্যালকুলেটরের মতো, কিছু সত্য / মিথ্যা এবং রেজেক্স ধরণের স্টাফ। এটি শেল-নিরপেক্ষ কমান্ড।এটিও লক্ষণীয় যে পাটিগণিতের সম্প্রসারণ এবং কমান্ডের প্রতিস্থাপনটি পসিক্স স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হয়েছে letএবং যখন $[...]তা নয়।
letকমান্ড পাটিগণিত মূল্যায়ন করে এবং এটি শেল অন্তর্নির্মিত।
এই আদেশটি চালান এবং আপনি কিছুই পান না (কেবল মূল্যায়ন করুন):
let 1+2$(( ))পাটিগণিত সম্প্রসারণ করতে ব্যবহৃত হয় : এখানে পড়ুন
এটি চালান এবং আপনি একটি ত্রুটি পাবেন (বিস্তারের কারণে):
$((1+2))$[ ] পাটিগণিত বৃদ্ধির জন্য পুরানো বাক্য গঠন:
পুরানো ফর্ম্যাট $ [অভিব্যক্তি] অবহেলা করা হয়েছে এবং বাশের আগমনে সরানো হবে। বাশ ম্যান পৃষ্ঠা
expr একটি বাইনারি কমান্ড, যদি আপনি একটি কমান্ড সাবস্কিওশন মধ্যে পাটিগণিত সম্প্রসারণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
echo $(expr 1 + 2)
echo `expr 1 + 2`যেহেতু উপরের কয়েকটি উত্তর সুনির্দিষ্টভাবে উল্লেখ ksh93করেছে যে এটি লক্ষণীয় যে এটি ভাসমান পয়েন্ট গণিত করতে পারে, যেমন:
$ print $((1.0/3))
0.333333333333333333
আপনি প্রিন্টফের সাহায্যে আউটপুটটির নির্ভুলতা নিয়ন্ত্রণ করতে পারেন, যেমন:
$ printf "%.4f\n" $((1.0/3))
0.3333
কমপক্ষে একটি যুক্তি অবশ্যই উপরের মতো ভাসমান-পয়েন্ট নম্বর হিসাবে নির্দিষ্ট করতে হবে। যদি উভয়ই পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয় তবে কেবল পূর্ণসংখ্যার গণিত সম্পন্ন হয়, যেমন:
$ print $((1/3))
0
আপনি যখন কোনও শেল স্ক্রিপ্টে ভাসমান পয়েন্ট গণিত প্রয়োজন তখন এটি সহায়ক হতে পারে যেহেতু আপনি কোনও বাহ্যিক কমান্ড কল করা এড়াতে পারেন।
zshউত্তর পোস্ট করেছি । যেহেতু kshএবং bashএকে অপরের সাথে সাদৃশ্যপূর্ণ (সাধারণভাবে) উভয়ের চেয়ে বেশি zsh, তাই আমার কাছে মনে kh93হয় যে এই প্রশ্নের উত্তর ভিত্তিক উত্তরটি বেশ কার্যকর হতে পারে।
((...))আসলে এ বরাদ্দকরণ জন্য ব্যবহার করা যাবেbash,kshএবংzsh:n=10; ((n+=10)); echo $n20 ছাপে((x=1)); echo $xকপি করে প্রিন্ট 1.