কমান্ড-লাইন আর্গুমেন্ট হিসাবে '#' অক্ষরটি পাস করতে অক্ষম


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
স্ট্যাকওভারফ্লোতে সিনট্যাক্স হাইলাইট করে আপনার সমস্যাটি সুন্দরভাবে ফুটিয়ে তুলেছে :)
ব্র্যাড অ্যাল্রেড

উত্তর:


47

#ইউনিক্স শেলগুলিতে একটি মন্তব্য শুরু করে, অনেকটা //সি এর মতো in

এর অর্থ হ'ল যখন শেলটি প্রগামে আর্গুমেন্টগুলি পাস করে, এটি # অনুসরণ করে সমস্ত কিছু উপেক্ষা করে। এটি একটি ব্যাকস্ল্যাশ বা উদ্ধৃতি সহ পালিয়ে যাওয়ার অর্থ হ'ল এটি অন্যান্য প্যারামিটারগুলির মতো আচরণ করা হবে এবং প্রোগ্রামটি প্রত্যাশা অনুযায়ী কাজ করা উচিত।

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 আপনার শেল কীভাবে কাজ করে তা শিখতে হবে। এটির আপনার সি কোডের সাথে কোনও সম্পর্ক নেই।
চিপনার

3
আহ, যাতে আপনি ইন্টারেক্টিভ শেল সেশনে মন্তব্যগুলি টাইপ করতে পারেন , সুতরাং শেলটি টাইপ করা শেষ করার পরে তা অবিলম্বে উপেক্ষা করতে পারে। কি দরকারী বৈশিষ্ট্য।
জোকার_ভিডি

6
@ জোকার_ভিডি আপনি শেলটিকে কমান্ড-লাইন ইন্টারফেস হিসাবে মনে করার সময় এটি আসলে স্ক্রিপ্ট ইন্টারপ্রেটার। আপনি এটি একটি ইন্টারেক্টিভ সি এল এলির মতো ব্যবহার করতে পারবেন তা একটি দুর্দান্ত বোনাস। আপনি যখন "স্ক্রিপ্ট চালাচ্ছেন" বনাম ইন্টারেক্টিভভাবে কমান্ড টাইপ করে বনাম ব্যাখ্যা করা তাত্পর্যপূর্ণভাবে অন্যরকম আচরণ করবেন কেন? কি সম্পর্কে echo echo Hello, World | bash। এটা কি ইন্টারেক্টিভ? নাকি bash <<END?
ক্রিস্টোফার

6
@ জোকার_ভিডি: আমি আমার শেল ইতিহাসে আবার উল্লেখ করতে ইন্টারেক্টিভ সেশনে প্রায়শই মন্তব্যগুলি টাইপ করি। কখনও কখনও এটি স্টিডআউট থেকে নির্গত কোন কমিট হ্যাশ বা অন্য আইডি রেকর্ড করা হয়; কখনও কখনও এটি লক্ষণীয় যে কোনও কমান্ড আমার ভবিষ্যতের স্ব হিসাবে একটি নোট হিসাবে ব্যর্থ হয়েছে; কখনও কখনও এটি অ্যাডহক বেঞ্চমার্কিংয়ের জন্য টাইমিং ডেটা রেকর্ড করে। এটা তোলে হয় একটি দরকারী বৈশিষ্ট্য।
wchargin

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
তাদের কীভাবে পালানো উচিত?
ilkkachu

3
\ - ব্যাকস্ল্যাশ। এক্স ব্যবহার করে পালিয়ে গেছে:2 4 \{#,$,&,*} 5 6
ভিজেএএসএলএন

8

এর কারণ আপনি একটি shসদৃশ শেল ব্যবহার করছেন । উদ্ধৃত করুন #বা এটি ব্যবহার করে পালিয়ে যান \এবং এটি কার্যকর হবে।

এটিকে একটি মন্তব্য বলা হয় sh। এটি #(স্পেস-হ্যাশ) এবং এটির পরে কোনও যুক্তি বাতিল করার কারণ ঘটায় । এটি সি এর মন্তব্যে একইভাবে ব্যবহৃত হয়, যেখানে এটি কোড নথিতে ব্যবহৃত হয়।

স্ট্রিংস শুরু $বলা হয় ভেরিয়েবল মধ্যে 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

দয়া করে নোট করুন যে "s এর ভিতরে ভেরিয়েবলগুলি এখনও প্রসারিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.