গ্রেপ অ্যাপল ফাইল এবং গ্রেপ "অ্যাপল" ফাইলের মধ্যে পার্থক্য কী?


22

মধ্যে পার্থক্য কি grep apple fileএবং grep "apple" file? উদ্ধৃতি চিহ্নগুলি রাখলে কী হয়? তারা উভয়ই কাজ করে এবং ঠিক একই জিনিসটি প্রদর্শন করে (একই লাইনটি প্রদর্শন করে)।

উত্তর:


45

আপনার শেলটি কী কী অক্ষর বিশেষ বলে বিবেচনা করে এবং সিনট্যাকটিক অর্থ রাখে তার উপর উদ্ধৃতি চিহ্নগুলির প্রভাব রয়েছে। আপনার উদাহরণে এটি কোনও পার্থক্য করে না কারণ appleএমন কোনও অক্ষর নেই।

কিন্তু অন্য একটি উদাহরণ বিবেচনা করুন: grep apple tree fileশব্দ অনুসন্ধান করবে appleফাইলের মধ্যে treeএবং file, যেহেতু grep "apple tree" fileশব্দ অনুসন্ধান করবে apple treeফাইলে file। উদ্ধৃতি চিহ্নগুলি বাশকে বলে, যে শব্দটি স্পেসে "apple tree"নতুন প্যারামিটার শুরু হয় না তবে এটি বর্তমান প্যারামিটারের অংশ হবে। grep apple\ tree fileএকই ফলাফল তৈরি করবে, কারণ \নীচের চরিত্রটির বিশেষ অর্থটিকে উপেক্ষা করতে এবং আক্ষরিক অর্থে আচরণ করতে বাশকে বলে tells


2
এটি ওয়াইল্ডকার্ডগুলির সাথেও দৃশ্যমান। যদি আপনি এটি করেন grep a*b equations.txtতবে এটি অনুসন্ধান করবে a*b, যদি না বর্তমান ডিরেক্টরিতে কোনও ফাইল শুরু হয় যা একটি দিয়ে শুরু হয় এবং খ-এ শেষ না হয়, তবে (বিএএচ) কম্যান্ড লাইনে ফাইলের নামগুলি প্রসারিত করবে) গ্রেপ দিয়ে ডাকা হবে বিভিন্ন পরামিতি সম্পূর্ণ করুন, যার ফলে বিভিন্ন ফলাফল হয়। find . -name *.txtবর্তমান ডিরেক্টরিটিতে যদি কোনও টেক্সট ফাইল থাকে তবে লাইক হিসাবে একটি কমান্ড অপ্রত্যাশিত আচরণের ফলস্বরূপ এটি সন্ধানের ক্ষেত্রে সাধারণত সমস্যা হয় । এক্ষেত্রে উক্তি ব্যবহার করা ভাল।
SztupY

4
আর একটি গুরুত্বপূর্ণ বিষয় হ'ল ডাবল কোট ( ") এবং একক উদ্ধৃতি ( ') এর মধ্যে পার্থক্য । একক উদ্ধৃতি নির্দিষ্ট অক্ষরের ব্যাখ্যাকে বাধা $দেয় যেখানে ডাবল কোট ব্যাখ্যার অনুমতি দেয়। উদাহরণস্বরূপ grep '${USER}'পাঠ্যের সন্ধান করবে ${USER}, যেখানে grep "${USER}"ভেরিয়েবলের USER(যেমন johnstacen) লেখাটি সন্ধান করবে ।
ধানের ল্যান্ডউ

23

ডাবল উদ্ধৃতি মূল্যায়নের অনুমতি দেয়, একক উদ্ধৃতি মূল্যায়ন প্রতিরোধ করে, কমান্ড লাইনে ব্যবহার করার সময় কোনও উদ্ধৃতি ওয়াইল্ডকার্ড সম্প্রসারণের অনুমতি দেয় না। অনুমোদিত উদাহরণ হিসাবে:

[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)

আপনি ডাবল উদ্ধৃতিতে একক উদ্ধৃতি ব্যবহার করতে পারেন এবং আপনি ডাবল উদ্ধৃতিতে ডাবল উদ্ধৃতি ব্যবহার করতে পারেন, তবে একক উদ্ধৃতিতে ডাবল উদ্ধৃতিগুলি করা উচিত নয় (সেগুলি ছাড়াই) মূল্যায়ন করা হবে না, তাদের আক্ষরিক ব্যাখ্যা করা হবে। একক উদ্ধৃতিগুলির মধ্যে একক উদ্ধৃতিগুলি করা উচিত নয় (সেগুলি না ছাড়াই)।

কার্যকরভাবে বাশকে কার্যকরভাবে ব্যবহার করতে আপনার উদ্ধৃতিগুলির একটি সম্পূর্ণ বোঝা অর্জন করতে হবে। অনেক গুরুত্বপূর্ণ!

একটি সাধারণ নিয়ম হিসাবে আমি বাশকে উপাদানগুলিতে কিছু প্রসারিত করতে চাইলে (কোন অ্যারের মতো) উদ্ধৃতিগুলি ব্যবহার করি না, আমি আক্ষরিক স্ট্রিংগুলির জন্য একক উদ্ধৃতি ব্যবহার করি যা পরিবর্তিত হয় না এবং আমি ভেরিয়েবলগুলির জন্য ডাবল উদ্ধৃতিগুলির উদার ব্যবহার করি যে কোনও ধরণের স্ট্রিং ফিরে আসতে পারে। এটি স্পেস এবং বিশেষ অক্ষর সংরক্ষণ করা হবে তা নিশ্চিত করার জন্য।


আপনি ডাবল কোটের ভিতরে ডাবল কোটস কীভাবে ব্যবহার করবেন ??? এটা কি টাইপো? এবং এর পরিবর্তে আমি কেন একক উদ্ধৃতিতে ডাবল উদ্ধৃতিগুলি এড়িয়ে চলব? আমার ধারণা আপনি বাক্য মিশ্রিত করতে পারেন?
বাইট কমান্ডার

@ বাইটকম্যান্ডার হ্যাঁ ডাবল কোটের ভিতরে রাখা ডাবল কোটসের ধারণাটি বেশ সাধারণভাবে ব্যবহৃত হয় - বিশিষ্ট কার্যকারী উদাহরণের জন্য এই পোস্টটি দেখুন । এটি সাধারণত স্ট্রিংগুলি যুক্ত স্ট্রিংগুলি সুরক্ষার জন্য করা হয়, প্রায়শই পাথের স্ট্রিংগুলির ক্ষেত্রে। ডাবল উদ্ধৃতিগুলি একক উদ্ধৃতিতে বা পালানো ছাড়াই ব্যবহার করা যেতে পারে তবে তাদের আক্ষরিক অর্থেই ব্যাখ্যা করা হবে, এ কারণেই তারা মূল্যায়নে নেতৃত্ব দেবে না। আমি পোস্টে এই বিষয়টি পরিষ্কার করব
AsymLabs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.