$ '$ फू' और $ "$ फू" के बीच अंतर


9

मुझे एक चर संदर्भ में सिंगल और डबल कोट्स के बीच कुछ बारीकियों का पता लगाने में कठिनाई हो रही है

मैं परिभाषित करता हूं:

foo=pwd

फिर इन्हें चलाएं:

echo $'$foo'

कौन सा इकोस $foo(मतलब $मेरी इको कमांड में पहला गिरा है)

echo $"$foo"

यह इकोस pwd(जिसका अर्थ है बैश का विस्तार $foo, मेरा चर, इसके मूल्य तक)

echo $`$foo`

अंत में यह इकोस $~/scripts(मुझे उम्मीद है कि यह प्रिंट होगा ~/scriptsऔर नहीं $~/scripts)

क्या कोई मुझे इन अंतरों का पता लगाने में मदद कर सकता है?

जवाबों:


11

अंततः, अंतिम एक प्रिंट $~/scriptsक्योंकि कमांड के प्रतिस्थापन के बाद $`foo`शाब्दिक का संयोजन होता है $; इसलिए प्रमुख $की व्याख्या एक शाब्दिक $और `$foo`आज्ञा प्रतिस्थापन के रूप में अनुगामी के रूप में की जाती है।


मैंने कोड टैग हटा दिए हैं और सिर्फ `` `` `` वर्णों के साथ बदल दिया है। यदि आप कोड टैग पसंद करते हैं तो रोलबैक करने के लिए स्वतंत्र महसूस करें
टिम

@ धन्यवाद, निश्चित नहीं कि मैंने जो किया था, लेकिन किसी कारणवश आपके द्वारा संपादित किए जाने के बाद यह पोस्ट मेरे पहले संशोधन में बाधित हो गई, इसलिए मैंने इसे वापस ले लिया ... और अब मुझे लगता है कि संशोधन में यह ठीक लग रहा है। यह निश्चित नहीं है कि क्या हुआ है, अपने संस्करण में वापस आने से पहले प्रारूपण सैंडबॉक्स में यह परीक्षण करें, क्योंकि मुझे डर है कि मैं फिर से पोस्ट को बाधित कर सकता हूं। भले ही, प्रयास के लिए धन्यवाद।
कोस

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

2

पहला मामला:

echo $'$foo'

कौन सा इकोस $foo(मतलब $मेरी इको कमांड में पहला गिरा है)

पहले $कमांड के रूप में चलाया जाता है। इको को तर्कों के बीच रिक्त स्थान की आवश्यकता नहीं है, यह सिर्फ उन्हें लेता है।

तो इको $'$foo'कमांड चलाने के लिए फैलता है $(जो कमांड नहीं है इसलिए इसे अनदेखा करता है) और फिर इको '$foo'। किसी भी चीज़ ''को अंकित मूल्य पर लिया जाता है - यह इसका विस्तार या कुछ भी नहीं करता है। आप जो चाहते हैं उसे '' में रख सकते हैं और कुछ नहीं होता।

यदि आप इसके $साथ बदल देते हैं $$तो प्रक्रिया आईडी को इको कर दिया जाता है।


दूसरा:

echo $"$foo"

यह इकोस pwd(जिसका अर्थ है बैश का विस्तार $foo, मेरा चर, इसके मूल्य तक)

ऐसा इसलिए ""है क्योंकि यह विस्तार करने से नहीं रोकता है। ""सामान्य रूप से यह सुनिश्चित करने के लिए उपयोग किया जाता है कि तुलना करने के लिए एक मूल्य है।

यदि आपके पास एक चर है जो खाली हो सकता है (जैसे यह एक grepपरिणाम से है) तो आप दूसरे मूल्य / चर की तुलना करना चाहते हैं, आपको पहला चर अंदर लाना होगा ""। यह सुनिश्चित करता है कि कोड के एक खाली खंड (बैश देखता है) के बजाय हमेशा जांच करने की तुलना होती है, जो एक त्रुटि देता है।


अंत में, संख्या 3. यह दिलचस्प है।

echo $`$foo`

यह इकोस $~/scripts(मुझे उम्मीद है कि यह प्रिंट होगा ~/scriptsऔर नहीं $~/scripts)

ऐसा इसलिए है क्योंकि (इस मामले में) गूंज $पहले चरित्र को छाप रहा है । बैकटिक्स में कुछ डालने से चर के मान को कमांड के रूप में चलाया जा सकता है (बैश के हाल के संस्करणों में इसे करने का बेहतर तरीका है $(command))

तो पहले यह इको है $फिर यह फैलता ​`$foo`​है ​`pwd`​जो चलाया जाता है और लौटता है ~/Scripts। लेकिन हमारे पास $पहले प्रिंट था - इसलिए संपूर्ण आउटपुट है $~/Scripts


कुछ बहुत कठिन स्वरूपण पर अच्छा काम!
दोपहर

1
@Arronical धन्यवाद :) आप इसे देख नहीं सकते हैं लेकिन अंतिम वाक्य के लिए वहां कुछ शून्य-चौड़ाई वाले स्थान हैं। काल्पनिक इंटरनेट बिंदुओं के लिए मैं जो चीजें करता हूं ...!
टिम

1
+1 अच्छा जवाब। मैं सिर्फ यह कहूंगा कि जब तक आपके पास कोई विशिष्ट कारण नहीं है - तब तक चर चर डिफ़ॉल्ट होना चाहिए - न केवल संभव शून्य मानों को संभालने के लिए। आप इसके बारे में और अधिक जानना चाहते थे, इसके लिए unix.stackexchange.com/questions/171346/… देखें । ;)
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.