উদ্ধৃতি চিহ্নগুলি "শব্দ বিভাজন" রোধ করে। এটি হ'ল: সাদা স্পেস অক্ষরগুলিতে একাধিক আইটেমগুলিতে ভেরিয়েবলগুলি ভাঙ্গা করা (বা ডিফল্ট $IFS
শেল ভেরিয়েবলের মান হিসাবে সংজ্ঞায়িত হিসাবে স্পেস, ট্যাব এবং নিউলাইনগুলিতে আরও সঠিক হতে হবে )।
উদাহরণ স্বরূপ,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
এখানে আমরা howmany
ফাংশনটি সংজ্ঞায়িত করি যা কেবলমাত্র আমাদের জানতে পারি যে কতগুলি অবস্থানগত পরামিতি দেওয়া হয়। আপনি দেখতে পাচ্ছেন যে এখানে দুটি আইটেম ভেরিয়েবলকে দেওয়া হচ্ছে, এবং উদ্ধৃতিগুলির সাথে ভেরিয়েবলের পাঠ্যটিকে একক হিসাবে বিবেচনা করা হবে।
তথ্য সঠিকভাবে পাস করার জন্য এটি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি ভেরিয়েবলে ফাইলের পথ থাকে এবং ফাইলের নামের মধ্যে যে কোনও জায়গায় ফাঁকা জায়গা থাকে, আপনি যে কমান্ডটি চালনার চেষ্টা করছেন তা ব্যর্থ হতে পারে বা ভুল ফলাফল দিতে পারে। আমরা যদি $var
ভেরিয়েবলের সাহায্যে একটি ফাইল তৈরি করার চেষ্টা করতাম touch $var
তবে দুটি ফাইল তৈরি করতে পারি, তবে touch "$var"
কেবল একটি।
আপনার [ "$currentoutput" != "$lastoutput" ]
অংশ হিসাবে একই । এই নির্দিষ্ট পরীক্ষা দুটি স্ট্রিংয়ের সাথে তুলনা করে। যখন পরীক্ষা চলবে, [
কমান্ডটিতে 3 টি আর্গুমেন্ট দেখতে হবে - একটি পাঠ্য স্ট্রিং, !=
অপারেটর এবং অন্য পাঠ্য স্ট্রিং। ডাবল কোট রাখা শব্দের বিভাজন রোধ করে এবং [
কমান্ডটি ঠিক সেই 3 টি আর্গুমেন্টটি দেখে। এখন যদি ভেরিয়েবলগুলি নিরবচ্ছিন্ন হয় তবে কী হবে?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
এখানে, শব্দ বিভাজন ঘটে, এবং এর পরিবর্তে [
দুটি স্ট্রিং দেখেন hello
এবং world
অনুসরণ !=
, দুই অন্যান্য স্ট্রিং দ্বারা অনুসরণ hi world
। মূল বিষয়টি হ'ল ডাবল কোট ব্যতীত ভেরিয়েবলের বিষয়বস্তুগুলি একটি সম্পূর্ণ আইটেমের চেয়ে পৃথক ইউনিট হিসাবে বোঝা যায়।
কমান্ড সাবস্টিটিউশন বরাদ্দকরণের মতো ডাবল কোট লাগবে না
var=$( df )
আপনার df
কমান্ডের আউটপুট সংরক্ষণ করা হবে var
। যাইহোক, সর্বদা উদ্ধৃতি ভেরিয়েবল এবং কমান্ড প্রতিস্থাপনের দ্বিগুণ হওয়া ভাল অভ্যাস, $(...)
যদি না আপনি বাস্তবে না চান তবে আউটপুটটিকে আলাদা আইটেম হিসাবে বিবেচনা করা হয়।
পাশের নোটে,
while [ true ]
অংশ হতে পারে
while true
[
হ'ল একটি আদেশ যা তার যুক্তিগুলির মূল্যায়ন করে এবং [ whatever ]
ভিতরে যা আছে তা নির্বিশেষে সবসময় সত্য। বিপরীতে, while true
কমান্ডটি ব্যবহার করে true
যা সর্বদা সাফল্যের প্রস্থান স্থিতি দেয় (এবং ঠিক এটিই while
লুপের প্রয়োজন)। পার্থক্যটি কিছুটা আরও স্পষ্টতা এবং কম পরীক্ষা করা হয়। বিকল্পভাবে, আপনি এর :
পরিবর্তে ব্যবহার করতে পারেনtrue
echo "" date and Time
অংশে ডাবল উদ্ধৃতি সম্ভবত মুছে ফেলা হতে পারে। এগুলি কেবল একটি খালি স্ট্রিং এবং আউটপুটটিতে অতিরিক্ত স্থান যুক্ত করে। যদি এটি পছন্দসই হয় তবে এগুলিকে সেখানে রাখতে দ্বিধা বোধ করবেন তবে এই ক্ষেত্রে কোনও নির্দিষ্ট কার্যকরী মূল্য নেই।
lsusb >> test.log
এই অংশটি সম্ভবত প্রতিস্থাপন করা যেতে পারে echo "$currentoutput" >> test.log
। lsusb
এটি ইতিমধ্যে চালু হওয়ার পরে আবার চালানোর কোনও কারণ নেই currentoutput=$(lsusb)
। যে ক্ষেত্রে নিউলাইনগুলি পিছনে
আউটপুট সংরক্ষণ করতে হবে - কেউ কমান্ড চালানোর ক্ষেত্রে একাধিকবার মান দেখতে পারে, তবে ক্ষেত্রে এর lsusb
প্রয়োজন নেই। আপনি যত কম বাহ্যিক কমান্ড কল করবেন ততই ভাল, কারণ একটি অন্তর্নির্মিত কমান্ডের প্রতিটি কল সিপিইউ, মেমরির ব্যবহার এবং প্রয়োগের সময় ব্যয় করে (যদিও কমান্ডগুলি সম্ভবত স্মৃতি থেকে প্রাক-লোড হওয়া থাকে)।
আরো দেখুন:
while [ true ]
একটি অসীম লুপ তৈরি করে, তবে সম্ভবত আপনি যে কারণে এটি মনে করেন তা নয়;while [ false ]
এছাড়াও একটি অসীম লুপ উত্পাদন করে, কারণ একটি যুক্তি দিয়ে,[ ... ]
যদি সেই তর্কটি একটি খালি স্ট্রিং হয় তবে সফল হয়।while true
আসলে একটি কমান্ড চালিত করবেtrue
(যা সর্বদা সফল হয়)।