बीच क्या अंतर है 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
उसी परिणाम का उत्पादन करेगा, क्योंकि \
निम्नलिखित चरित्र के विशेष अर्थ की अवहेलना करने के लिए बैश बताता है और इसका शाब्दिक इलाज करता है।
"
) और एकल उद्धरणों ( '
) के बीच का अंतर है । एकल उद्धरण कुछ वर्णों की व्याख्या को रोकते हैं $
, जैसे कि दोहरे उद्धरण व्याख्या की अनुमति देते हैं। जैसे 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
तक खोज करेगा , जब तक कि वर्तमान निर्देशिका में कोई फ़ाइल नहीं है, जो a से शुरू होती है, और b में समाप्त होती है, उस स्थिति में (क्योंकि (ba) sh कमांड लाइन पर फ़ाइल नाम का विस्तार करेगी) grep के साथ कॉल किया जाएगा विभिन्न परिणामों में जिसके परिणामस्वरूप विभिन्न मापदंडों को पूरा करें। यह आमतौर पर फ़ाइंड के साथ एक समस्या के रूप में होता है, जैसे एक कमांड केfind . -name *.txt
परिणामस्वरूप अप्रत्याशित व्यवहार होगा, अगर वर्तमान निर्देशिका में एक txt फ़ाइल है। इस मामले में उद्धरण का उपयोग करना बेहतर है।