कमांड लाइन तर्क के रूप में '#' वर्ण पास करने में असमर्थ


36

मैं #कमांड-लाइन तर्कों के साथ शुरू होने वाले तारों को पास नहीं कर सकता ।

यहाँ एक सरल परीक्षण है:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

यदि मैं तर्कों को निम्नानुसार इनपुट करता हूं:

2 4 # 5 6

का मूल्य argcहै 3और नहीं 6। यह पढ़ता है #और वहाँ रुक जाता है। मुझे नहीं पता कि क्यों, और मैं सी प्रोग्रामिंग भाषा और सी प्राइमर प्लस की मेरी प्रतियों में उत्तर नहीं पा सकता हूं ।


44
StackOverflow पर प्रकाश डाला गया वाक्यविन्यास आपकी समस्या को अच्छी तरह से दिखाता है :)
ब्रैड ऑलरेड

जवाबों:


47

#यूनिक्स गोले में एक टिप्पणी शुरू करता है, //सी में बहुत पसंद है।

इसका मतलब यह है कि जब शेल प्रोगम के तर्कों को पारित करता है, तो यह # का पालन करते हुए सबकुछ अनदेखा कर देता है। बैकस्लैश या उद्धरण के साथ इसे हटाने का मतलब होगा कि इसे अन्य मापदंडों की तरह माना जाता है और कार्यक्रम को उम्मीद के मुताबिक काम करना चाहिए।

2 4 \# 5 6

या

2 4 '#' 5 6

या

2 4 "#" 5 6

ध्यान दें कि #केवल एक शब्द के शुरू में एक टिप्पणी चरित्र है, इसलिए यह भी काम करना चाहिए:

2 4#5 6

2
यह एक बहुत अच्छी सूची प्रतीत होती है। unix.stackexchange.com/a/270979
fanduin

22
@ सीडी -00 आपको यह जानने की जरूरत है कि शेल कैसे काम करता है। इसका आपके C कोड से कोई लेना-देना नहीं है।
शेपनर

3
आह, इसलिए आप इंटरेक्टिव शेल सत्रों में टिप्पणियां टाइप कर सकते हैं , इसलिए शेल ने टाइपिंग समाप्त करने के बाद इसे immedaitely अनदेखा कर सकते हैं। क्या उपयोगी सुविधा है।
जोकर_vD

6
@Joker_vD जब आप शेल को कमांड-लाइन इंटरफ़ेस के रूप में सोचते हैं, तो यह वास्तव में एक स्क्रिप्ट दुभाषिया है। तथ्य यह है कि आप इसे एक इंटरैक्टिव सीएलआई की तरह उपयोग कर सकते हैं एक अच्छा बोनस है। जब आप इंटरेक्टिव रूप से कमांड टाइप कर रहे हों तो व्याख्यात्मक रूप से भिन्न व्यवहार क्यों करना चाहिए? किस बारे में echo echo Hello, World | bash? क्या वह इंटरैक्टिव है? या हो सकता है bash <<END?
क्रिस्टोफर

6
@ जोकर_वीडी: मैं अपने शैल इतिहास में वापस संदर्भित करने के लिए अक्सर इंटरैक्टिव सत्रों में टिप्पणियां टाइप करता हूं। कभी-कभी यह एक प्रतिबद्ध हैश या अन्य आईडी को रिकॉर्ड करने के लिए किया जाता है जिसे स्टडआउट किया जाता है; कभी-कभी यह नोट करना है कि एक कमांड मेरे भविष्य के स्वयं के लिए एक नोट के रूप में विफल रही; कभी-कभी यह तदर्थ बेंचमार्किंग के लिए समय डेटा रिकॉर्ड करने के लिए है। यह है एक उपयोगी सुविधा।
5

12

कमांड लाइन तर्कों के माध्यम से मूल्य पारित करते समय आपको इन निम्नलिखित निर्देशों के माध्यम से चलना होगा। निम्नलिखित वर्णों का शेल के कुछ संदर्भों में विशेष अर्थ है और उन्हें तर्कों में बच निकलने की आवश्यकता हो सकती है:

` Backtick (U+0060 Grave Accent)
~ Tilde (U+007E)
! Exclamation mark (U+0021)
# Hash (U+0023 Number Sign)
$ Dollar sign (U+0024)
& Ampersand (U+0026)
* Asterisk (U+002A)
( Left Parenthesis (U+0028)
) Right parenthesis (U+0029)
 (⇥) Tab (U+0009)
{ Left brace (U+007B Left Curly Bracket)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1

3
फिर उन्हें कैसे भागना चाहिए?
इलकाकचू

3
\ - बैकस्लैश 2 4 \{#,$,&,*} 5 6
.EX

8

ऐसा इसलिए है क्योंकि आप एक shतरह के खोल का उपयोग कर रहे हैं । उद्धरण #या इसका उपयोग करके बच जाओ \और यह काम करेगा।

यह एक कहा जाता है टिप्पणी में sh। यह #(स्पेस-हैश) और उसके बाद किसी भी तर्क को त्यागने का कारण बनता है । यह C में टिप्पणियों के समान उपयोग किया जाता है, जहां इसका उपयोग दस्तावेज़ कोड के लिए किया जाता है।

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

उदाहरण के लिए, ये सभी #आपके आवेदन को पारित करने के लिए वैध तरीके होंगे :

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

और ये एक स्ट्रिंग से गुजरने के लिए वैध तरीके होंगे, जो शुरू होता है $:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

कृपया ध्यान दें कि "एस के अंदर चर अभी भी विस्तारित हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.