লেট, এক্সপ্রেস এবং $ [] এর মধ্যে পার্থক্য


23

এর মধ্যে পার্থক্যটি ঠিক কী তা জানতে চাই

a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )

সমস্ত 4 ভেরিয়েবল 2 এর সাথে বরাদ্দ করে তবে পার্থক্য কী?

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

উত্তর:


25

এই সমস্তই পাটিগণিতের সাথে লেনদেন করে তবে বিভিন্ন উপায়ে এবং পরিবর্তনশীলটি বিভিন্ন উপায়ে তৈরি করা হয়। এর মধ্যে কয়েকটি 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এবং যখন $[...]তা নয়।


1
((...))আসলে এ বরাদ্দকরণ জন্য ব্যবহার করা যাবে bash, kshএবং zsh: n=10; ((n+=10)); echo $n20 ছাপে ((x=1)); echo $xকপি করে প্রিন্ট 1.
Alexej মাগুরা

1
@ আলেকজ আপনাকে ধন্যবাদ উত্তর আপডেট হয়েছে, সেই অংশটি সরানো হয়েছে
সের্গি কলডিয়াজহনি

11
  • letকমান্ড পাটিগণিত মূল্যায়ন করে এবং এটি শেল অন্তর্নির্মিত।

    • এই আদেশটি চালান এবং আপনি কিছুই পান না (কেবল মূল্যায়ন করুন):

      let 1+2
  • $(( ))পাটিগণিত সম্প্রসারণ করতে ব্যবহৃত হয় : এখানে পড়ুন

    • এটি চালান এবং আপনি একটি ত্রুটি পাবেন (বিস্তারের কারণে):

      $((1+2))
  • $[ ] পাটিগণিত বৃদ্ধির জন্য পুরানো বাক্য গঠন:

    পুরানো ফর্ম্যাট $ [অভিব্যক্তি] অবহেলা করা হয়েছে এবং বাশের আগমনে সরানো হবে। বাশ ম্যান পৃষ্ঠা

  • expr একটি বাইনারি কমান্ড, যদি আপনি একটি কমান্ড সাবস্কিওশন মধ্যে পাটিগণিত সম্প্রসারণ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

    echo $(expr 1 + 2) 
    echo `expr 1 + 2`

4

যেহেতু উপরের কয়েকটি উত্তর সুনির্দিষ্টভাবে উল্লেখ ksh93করেছে যে এটি লক্ষণীয় যে এটি ভাসমান পয়েন্ট গণিত করতে পারে, যেমন:

$ print $((1.0/3)) 
0.333333333333333333

আপনি প্রিন্টফের সাহায্যে আউটপুটটির নির্ভুলতা নিয়ন্ত্রণ করতে পারেন, যেমন:

$ printf "%.4f\n" $((1.0/3))
0.3333

কমপক্ষে একটি যুক্তি অবশ্যই উপরের মতো ভাসমান-পয়েন্ট নম্বর হিসাবে নির্দিষ্ট করতে হবে। যদি উভয়ই পূর্ণসংখ্যা হিসাবে নির্দিষ্ট করা হয় তবে কেবল পূর্ণসংখ্যার গণিত সম্পন্ন হয়, যেমন:

$ print $((1/3))  
0

আপনি যখন কোনও শেল স্ক্রিপ্টে ভাসমান পয়েন্ট গণিত প্রয়োজন তখন এটি সহায়ক হতে পারে যেহেতু আপনি কোনও বাহ্যিক কমান্ড কল করা এড়াতে পারেন।


আমার কাছে এমনটি ঘটে যে আপনি কোনও উত্তর পোস্ট করতে আগ্রহী হতে পারেন আমি কি ব্যাশ স্ক্রিপ্টে ভগ্নাংশ / দশমিক ব্যবহার করতে পারি? শিরোনাম সত্ত্বেও, আমি মনে করি প্রসঙ্গটি পরিষ্কার করে দিয়েছে যে অন্যান্য বোর্ন-স্টাইলের শাঁসগুলি প্রাসঙ্গিক, এজন্য আমি একটি zshউত্তর পোস্ট করেছি । যেহেতু kshএবং bashএকে অপরের সাথে সাদৃশ্যপূর্ণ (সাধারণভাবে) উভয়ের চেয়ে বেশি zsh, তাই আমার কাছে মনে kh93হয় যে এই প্রশ্নের উত্তর ভিত্তিক উত্তরটি বেশ কার্যকর হতে পারে।
এলিয়াহ

1

letক্রোন কাজ করে না। আমি মনে করি letএটির নিজস্ব পরিবেশ থাকার কারণে । $((...))এটি পজিক্স হওয়ার পর থেকে ব্যবহার করুন । উদাহরণ স্বরূপ,

let x=1+2
echo x=$x

ক্রোনে, "x =" এ ফলাফল আসে, তবে শেল থেকে চালিত হলে "x = 3" হয়।

x=$((1+2))
echo x=$x

সব ক্ষেত্রে "x = 3" এর ফলাফল।

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