'#'文字をコマンドライン引数として渡すことができません


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

argcis の値3とnot の値6。読み#、そこで停止します。なぜなのかわからないし、Cプログラミング言語Cプライマープラスのコピーにも答えがありません。


44
StackOverflowでの構文の強調表示は問題をうまく示しています:)
Brad Allred

回答:


47

#//Cと同様に、UNIXシェルでコメントを開始します。

これは、シェルが引数をプログラムに渡すときに、#に続くすべてを無視することを意味します。バックスラッシュまたは引用符でエスケープすると、他のパラメータと同様に扱われ、プログラムは期待どおりに動作するはずです。

2 4 \# 5 6

または

2 4 '#' 5 6

または

2 4 "#" 5 6

#は単語の先頭にあるコメント文字なので、これも機能することに注意してください。

2 4#5 6

2
これはかなり良いリストのようですunix.stackexchange.com/a/270979
fanduin

22
@ cd-00シェルの仕組みを学ぶ必要があります。これはCコードとは関係ありません。
chepner

3
ああ、そうすれば、対話型シェルセッションでコメントを入力できるので、入力の完了後、シェルはすぐにコメントを無視できます。なんと便利な機能でしょう。
Joker_vD

6
@Joker_vDシェルをコマンドラインインターフェースと見なす一方で、それは実際にはスクリプトインタープリターです。インタラクティブなCLIのように使用できるという事実は素晴らしいボーナスです。「スクリプトを実行している」場合と対話的にコマンドを入力している場合のインタープリターの動作が大きく異なるのはなぜですか?どうかecho echo Hello, World | bash。それはインタラクティブですか?それともbash <<END
Christopher Schultz

6
@Joker_vD:対話型のセッションでコメントを頻繁に入力して、シェルの履歴で再度参照しています。時々、これはコミットハッシュまたはstdoutに発行された他のIDを記録することです。時々それは私の将来の自分へのメモとしてコマンドが失敗したことに注意することです。時々、その場限りのベンチマークのためにタイミングデータを記録することです。これは、ある便利な機能。
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
\-バックスラッシュ.EXを使用してエスケープしました:2 4 \{#,$,&,*} 5 6
VJAYSLN

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

"s 内の変数はまだ展開されていることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.