Grep Apple फ़ाइल और grep "ऐप्पल" फ़ाइल के बीच क्या अंतर है?


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उसी परिणाम का उत्पादन करेगा, क्योंकि \निम्नलिखित चरित्र के विशेष अर्थ की अवहेलना करने के लिए बैश बताता है और इसका शाब्दिक इलाज करता है।


2
वाइल्डकार्ड के साथ भी यह दिखाई देता है। यदि आप ऐसा करते हैं, grep a*b equations.txtतो यह तब a*bतक खोज करेगा , जब तक कि वर्तमान निर्देशिका में कोई फ़ाइल नहीं है, जो a से शुरू होती है, और b में समाप्त होती है, उस स्थिति में (क्योंकि (ba) sh कमांड लाइन पर फ़ाइल नाम का विस्तार करेगी) grep के साथ कॉल किया जाएगा विभिन्न परिणामों में जिसके परिणामस्वरूप विभिन्न मापदंडों को पूरा करें। यह आमतौर पर फ़ाइंड के साथ एक समस्या के रूप में होता है, जैसे एक कमांड के find . -name *.txtपरिणामस्वरूप अप्रत्याशित व्यवहार होगा, अगर वर्तमान निर्देशिका में एक txt फ़ाइल है। इस मामले में उद्धरण का उपयोग करना बेहतर है।
१२:१२

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)

आप दोहरे उद्धरण चिह्नों के अंदर एकल उद्धरणों का उपयोग कर सकते हैं और आप दोहरे उद्धरण चिह्नों के अंदर दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं, लेकिन एकल उद्धरणों के अंदर दोहरे उद्धरणों को नहीं किया जाना चाहिए (उन्हें भागने के बिना) का मूल्यांकन नहीं किया जाएगा, उनकी शाब्दिक व्याख्या की जाएगी। एकल उद्धरण के भीतर एकल उद्धरण नहीं किया जाना चाहिए (उन्हें भागने के बिना)।

आपको बैश का प्रभावी ढंग से उपयोग करने के लिए उद्धरणों की गहन समझ प्राप्त करने की आवश्यकता होगी। बहोत महत्वपूर्ण!

एक सामान्य नियम के रूप में, अगर मैं बैश को तत्वों में कुछ (जैसे एक सरणी) का विस्तार करना चाहता हूं, तो मैं उद्धरणों का उपयोग नहीं करता हूं, मैं शाब्दिक तार के लिए एकल उद्धरण का उपयोग करता हूं जो बदल नहीं जा रहे हैं, और मैं चर के लिए दोहरे उद्धरण का उदार उपयोग करता हूं किसी भी प्रकार की स्ट्रिंग की वापसी की संभावना है। यह सुनिश्चित करना है कि रिक्त स्थान और विशेष पात्रों को संरक्षित किया जाएगा।


आप दोहरे उद्धरण चिह्नों के अंदर दोहरे उद्धरण चिह्नों का उपयोग कैसे करेंगे ??? क्या वह टाइपो है? और मुझे इसके बजाय सिंगल कोट्स के अंदर दोहरे उद्धरणों से क्यों बचना चाहिए? मुझे लगता है कि आप वाक्यों को मिला सकते हैं?
बाइट कमांडर

@ByteCommander हाँ, दोहरे उद्धरण चिह्नों के अंदर रखे गए दोहरे उद्धरण चिह्नों की अवधारणा का काफी उपयोग किया जाता है - इस पोस्ट को एक प्रमुख कार्य उदाहरण के लिए देखें। यह आमतौर पर उन स्ट्रिंग्स की सुरक्षा के लिए किया जाता है जिनमें रिक्त स्थान होते हैं, अक्सर पथ स्ट्रिंग्स के संबंध में। दोहरे उद्धरण चिह्नों के साथ या बिना भागने के भीतर उपयोग किए जा सकते हैं, लेकिन उनकी शाब्दिक व्याख्या की जाएगी, यानी वे मूल्यांकन के लिए नेतृत्व नहीं करेंगे। मैं इस बात को पोस्ट में स्पष्ट करूँगा।
AsymLabs 18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.