18

コマンドライン引数を介して入力を受け入れるプログラムを Java で作成しました。コマンド ラインから 2 つの数字と演算子を入力します。2 つの数を掛けるには、例として入力する必要があります5 3 *が、書かれているとおりに機能しません。

*コマンドラインから受け付けないのはなぜですか?

4

6 に答える 6

33

これ*は、 がシェルのワイルドカードであるためです。これはシェルにとって特別な意味を持ち、コマンド (この場合はjava) に渡す前に展開します。

リテラルが必要なので*、シェルからエスケープする必要があります。エスケープの正確な方法はシェルによって異なりますが、次の方法を試すことができます。

java ProgramName 5 3 "*"

または:

java ProgramName 5 3 \*

ところで、シェルが で何をするか知りたい場合は*、 の内容をメソッドに出力してみString[] argsてくださいmain。ディレクトリ内のファイルの名前が含まれていることがわかります。

これは、いくつかのファイル名をコマンド ライン引数として渡す必要がある場合に便利です。

こちらもご覧ください

  • ウィキペディア: グロブ

    たとえば、ディレクトリに 2 つのファイルが含まれている場合a.logb.logコマンドcat *.logはシェルによって次のように展開されます。cat a.log b.log

  • ウィキペディア: エスケープ文字

    Bourne シェル ( sh) では、アスタリスク ( *) および疑問符 ( ?) 文字は、グロビングによって展開されるワイルドカード文字です。先行するエスケープ文字*がない場合、ピリオドで始まらない作業ディレクトリ内のすべてのファイルの名前にそのようなファイルが存在する場合にのみ展開され、それ以外の場合は展開されません*。そのため、文字どおり と呼ばれるファイルを参照するには、そのファイル"*"の前にバックスラッシュ ( ) を付けて、このように解釈しないようにシェルに指示する必要があります\

于 2010-04-27T05:17:42.563 に答える
5

MS WINDOWS では正しくありません: "java.exe" はワイルドカードを使用してコマンド ライン引数を黙って展開します

  • *
  • ?
  • [abc]

、しかし最後のコンポーネントだけなので、

a/*/*

期待どおりに動作しません。

また、エントリ "." も無視されます。および ".." ですが、"." で始まる他のファイル名は受け入れられます。

誤解を避けるために: PROCEXP で実行中の JAVA プロセスのコマンド ラインを見ると、展開されていない引数が表示されます。

これを回避する方法が見つかりませんでした。つまり、現在のディレクトリに少なくとも 1 つのファイルまたはディレクトリがある限り、"java Calc 3 * 7" は機能しません。

これは非常に醜く、Java 8 までのすべての JRE バージョンに常に存在していたようです。

Java の厄介なコマンドライン展開を無効にする方法を知っている人はいますか?

于 2015-07-13T13:30:32.503 に答える
4

* は、シェル インタープリターで特別な意味を持ちます。* を取得する方法は、使用しているシェル インタープリターによって異なります。Bash の場合、"*" のような二重引用符ではなく、単一引用符 ('*') で囲む必要があります。

于 2010-04-27T05:27:47.930 に答える
2

*のように引用符で囲んでみてください"*"。星印は、コマンド ラインで予約されている記号です。

于 2010-04-27T05:17:56.790 に答える
1

一重引用符を使用:

java FooBar 5 3 '*'

これは、一般的なシェル (bash や ksh を含む) のほとんどで動作します。

于 2016-05-26T15:57:11.217 に答える