2010-10-18 8 views
7

शेल पटकथा लेखन में की आरएचएस पर चर के हवाले नहीं बनाम का हवाला देते हुए, क्या इन 2 के बीच अंतर है क्या मुझे दूसरे पर एक का उपयोग करना चाहिए?चर काम

उत्तर

2

Advanced Bash-Scripting Guide: Chapter 5: Quoting

जब एक चर संदर्भित है, यह आम तौर पर दोहरे उद्धरण में अपने नाम संलग्न करने की सलाह दी जाती है। यह उद्धृत स्ट्रिंग के भीतर सभी विशेष वर्णों की पुनरावृत्ति को रोकता है। शब्द विभाजन को रोकने के लिए डबल कोट्स का उपयोग करें। में संलग्न एक तर्क स्वयं को एकल शब्द के रूप में प्रस्तुत करता है, भले ही इसमें व्हाइटस्पेस विभाजक शामिल हों।

+2

यह सामान्य रूप से अच्छी सलाह है, लेकिन विशिष्ट मामले में ओपी का उल्लेख है, उद्धरण कोई उद्देश्य नहीं देता है। – user000001

+0

वास्तव में, यह आम तौर पर अच्छी सलाह है (और यह लगभग आश्चर्यजनक है कि एबीएस से आ रहा है क्योंकि इसमें कम से कम अच्छे सुझाव देने और अच्छे अभ्यास को अनदेखा करने की प्रवृत्ति है) लेकिन यह पूछे जाने वाले प्रश्न से प्रासंगिक नहीं है। –

+0

आप किस गाइड की सिफारिश करेंगे? –

4

मुझे लगता है कि यहां कोई बड़ा अंतर नहीं है। हां, यह वैरिएबल को डबल कोट्स में संलग्न करने की सलाह दी जाती है जब उस चर का संदर्भ दिया जा रहा है। हालांकि, $x को आपके प्रश्न में यहां संदर्भित नहीं किया गया प्रतीत होता है।

y=$x स्वयं को प्रभावित नहीं करता है कि सफेद जगहों को कैसे नियंत्रित किया जाएगा। यह केवल तभी होता है जब $y वास्तव में मामलों का हवाला देते हुए उपयोग किया जाता है। उदाहरण के लिए:

$ x=" a b " 
$ y=$x 
$ echo $y 
a b 
$ echo "$y" 
a b 
4

कोई (अच्छा) कारणों जब अपने आप ही एक बयान के रूप में इस्तेमाल एक चर असाइनमेंट की बोली दोगुना करने के लिए आरएचएस हैं।

असाइनमेंट कथन का आरएचएस शब्द विभाजन (या ब्रेस विस्तार) आदि के अधीन नहीं है, इसलिए सही तरीके से असाइन करने के लिए कोट्स की आवश्यकता नहीं हो सकती है। अन्य सभी विस्तार (जहां तक ​​मुझे पता है) आरएचएस पर होते हैं लेकिन डबल कोट्स में भी होते हैं, इसलिए उद्धरण कोई उद्देश्य नहीं देता है।

कहा जा रहा है कि आरएचएस उद्धृत करने के लिए कारण नहीं हैं। अर्थात् how to address error "bash: !d': event not found" in Bash command substitution (विशेष रूप से मेरा उत्तर और अमीर का जवाब देखें)।

2

यहां कुछ अन्य उदाहरण हैं: (वर्तमान निर्देशिका t.sh में दो फ़ाइलों और file होने)

a='$(ls)'  # no command substitution 
b="$(ls)"  # command substitution, no word splitting 
c='*'   # no filename expansion 
d="*"   # no filename expansion 
e=*    # no filename expansion 
f=$a    # no expansions or splittings 
g="$a"   # no expansions or splittings 
h=$d    # no expansions or splittings 

echo ---'$a'--- 
echo $a   # no command substitution 
echo ---'$b'--- 
echo $b   # word splitting 
echo ---'"$b"'--- 
echo "$b"  # no word splitting 
echo ---'$c'--- 
echo $c   # filename expansion, word splitting 
echo ---'"$c"'--- 
echo "$c"  # no filename expansion, no word splitting 
echo ---'$d'--- 
echo $d   # filename expansion, word splitting 
echo ---'"$d"'--- 
echo "$d"  # no filename expansion, no word splitting 
echo ---'"$e"'--- 
echo "$e"  # no filename expansion, no word splitting 
echo ---'$e'--- 
echo $e   # filename expansion, word splitting 
echo ---'"$f"'--- 
echo "$f"  # no filename expansion, no word splitting 
echo ---'"$g"'--- 
echo "$g"  # no filename expansion, no word splitting 
echo ---'$h'--- 
echo $h   # filename expansion, word splitting 
echo ---'"$h"'--- 
echo "$h"  # no filename expansion, no word splitting 

आउटपुट:

---$a--- 
$(ls) 
---$b--- 
file t.sh 
---"$b"--- 
file 
t.sh 
---$c--- 
file t.sh 
---"$c"--- 
* 
---$d--- 
file t.sh 
---"$d"--- 
* 
---"$e"--- 
* 
---$e--- 
file t.sh 
---"$f"--- 
$(ls) 
---"$g"--- 
$(ls) 
---$h--- 
file t.sh 
---"$h"--- 
* 

एक दिलचस्प बात यह है कि सूचना के लिए आदेश प्रतिस्थापन चर में होता है असाइनमेंट अगर वे डबल कोट्स में हैं, और यदि आरएचएस को "$(ls)" के रूप में स्पष्ट रूप से दिया गया है और "$a" के रूप में स्पष्ट रूप से नहीं है ..

संबंधित मुद्दे