মধ্যে পার্থক্য কি grep apple file
এবং grep "apple" file
? উদ্ধৃতি চিহ্নগুলি রাখলে কী হয়? তারা উভয়ই কাজ করে এবং ঠিক একই জিনিসটি প্রদর্শন করে (একই লাইনটি প্রদর্শন করে)।
মধ্যে পার্থক্য কি grep apple file
এবং grep "apple" file
? উদ্ধৃতি চিহ্নগুলি রাখলে কী হয়? তারা উভয়ই কাজ করে এবং ঠিক একই জিনিসটি প্রদর্শন করে (একই লাইনটি প্রদর্শন করে)।
উত্তর:
আপনার শেলটি কী কী অক্ষর বিশেষ বলে বিবেচনা করে এবং সিনট্যাকটিক অর্থ রাখে তার উপর উদ্ধৃতি চিহ্নগুলির প্রভাব রয়েছে। আপনার উদাহরণে এটি কোনও পার্থক্য করে না কারণ apple
এমন কোনও অক্ষর নেই।
কিন্তু অন্য একটি উদাহরণ বিবেচনা করুন: grep apple tree file
শব্দ অনুসন্ধান করবে apple
ফাইলের মধ্যে tree
এবং file
, যেহেতু grep "apple tree" file
শব্দ অনুসন্ধান করবে apple tree
ফাইলে file
। উদ্ধৃতি চিহ্নগুলি বাশকে বলে, যে শব্দটি স্পেসে "apple tree"
নতুন প্যারামিটার শুরু হয় না তবে এটি বর্তমান প্যারামিটারের অংশ হবে। grep apple\ tree file
একই ফলাফল তৈরি করবে, কারণ \
নীচের চরিত্রটির বিশেষ অর্থটিকে উপেক্ষা করতে এবং আক্ষরিক অর্থে আচরণ করতে বাশকে বলে tells
"
) এবং একক উদ্ধৃতি ( '
) এর মধ্যে পার্থক্য । একক উদ্ধৃতি নির্দিষ্ট অক্ষরের ব্যাখ্যাকে বাধা $
দেয় যেখানে ডাবল কোট ব্যাখ্যার অনুমতি দেয়। উদাহরণস্বরূপ grep '${USER}'
পাঠ্যের সন্ধান করবে ${USER}
, যেখানে grep "${USER}"
ভেরিয়েবলের USER
(যেমন johnstacen
) লেখাটি সন্ধান করবে ।
ডাবল উদ্ধৃতি মূল্যায়নের অনুমতি দেয়, একক উদ্ধৃতি মূল্যায়ন প্রতিরোধ করে, কমান্ড লাইনে ব্যবহার করার সময় কোনও উদ্ধৃতি ওয়াইল্ডকার্ড সম্প্রসারণের অনুমতি দেয় না। অনুমোদিত উদাহরণ হিসাবে:
[user@work test]$ ls .
A.txt B.txt C.txt D.cpp
# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp
[user@work test]$ echo "*"
*
[user@work test]$ echo '*'
*
# The following is the same as writing echo 'A.txt B.txt C.txt'
[user@work test]$ echo *.txt
A.txt B.txt C.txt
[user@work test]$ echo "*.txt"
*.txt
[user@work test]$ echo '*.txt'
*.txt
[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found
[user@work test]$ myname=is\ Fred; echo $myname
is Fred
[user@work test]$ myname="is Fred"; echo $myname
is Fred
[user@work test]$ myname='is Fred'; echo $myname
is Fred
কোটের কাজের উপায় বোঝা বাশকে বোঝার জন্য গুরুত্বপূর্ণ। উদাহরণ স্বরূপ:
# for will operate on each file name separately (like an array), looping 3 times.
[user@work test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt
# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[user@work test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt
# this just returns the string - it can't be evaluated in single quotes.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)
আপনি একটি ভেরিয়েবলের মাধ্যমে কমান্ড পাস করতে একক উদ্ধৃতি ব্যবহার করতে পারেন। একক উদ্ধৃতি মূল্যায়ন রোধ করবে। ডাবল উদ্ধৃতি মূল্যায়ন করবে।
# This returns three distinct elements, like an array.
[user@work test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt
# This returns what looks like three elements, but it is actually a single string.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt
# This cannot be evaluated, so it returns whatever is between quotes, literally.
[user@work test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)
আপনি ডাবল উদ্ধৃতিতে একক উদ্ধৃতি ব্যবহার করতে পারেন এবং আপনি ডাবল উদ্ধৃতিতে ডাবল উদ্ধৃতি ব্যবহার করতে পারেন, তবে একক উদ্ধৃতিতে ডাবল উদ্ধৃতিগুলি করা উচিত নয় (সেগুলি ছাড়াই) মূল্যায়ন করা হবে না, তাদের আক্ষরিক ব্যাখ্যা করা হবে। একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতিগুলি করা উচিত নয় (সেগুলি না ছাড়াই)।
কার্যকরভাবে বাশকে কার্যকরভাবে ব্যবহার করতে আপনার উদ্ধৃতিগুলির একটি সম্পূর্ণ বোঝা অর্জন করতে হবে। অনেক গুরুত্বপূর্ণ!
একটি সাধারণ নিয়ম হিসাবে আমি বাশকে উপাদানগুলিতে কিছু প্রসারিত করতে চাইলে (কোন অ্যারের মতো) উদ্ধৃতিগুলি ব্যবহার করি না, আমি আক্ষরিক স্ট্রিংগুলির জন্য একক উদ্ধৃতি ব্যবহার করি যা পরিবর্তিত হয় না এবং আমি ভেরিয়েবলগুলির জন্য ডাবল উদ্ধৃতিগুলির উদার ব্যবহার করি যে কোনও ধরণের স্ট্রিং ফিরে আসতে পারে। এটি স্পেস এবং বিশেষ অক্ষর সংরক্ষণ করা হবে তা নিশ্চিত করার জন্য।
grep a*b equations.txt
তবে এটি অনুসন্ধান করবেa*b
, যদি না বর্তমান ডিরেক্টরিতে কোনও ফাইল শুরু হয় যা একটি দিয়ে শুরু হয় এবং খ-এ শেষ না হয়, তবে (বিএএচ) কম্যান্ড লাইনে ফাইলের নামগুলি প্রসারিত করবে) গ্রেপ দিয়ে ডাকা হবে বিভিন্ন পরামিতি সম্পূর্ণ করুন, যার ফলে বিভিন্ন ফলাফল হয়।find . -name *.txt
বর্তমান ডিরেক্টরিটিতে যদি কোনও টেক্সট ফাইল থাকে তবে লাইক হিসাবে একটি কমান্ড অপ্রত্যাশিত আচরণের ফলস্বরূপ এটি সন্ধানের ক্ষেত্রে সাধারণত সমস্যা হয় । এক্ষেত্রে উক্তি ব্যবহার করা ভাল।