*在命令行参数中的问题

我用Java编写了一个程序,通过命令行参数接受input。 我从命令行得到两个数字和一个操作符的input。 要乘两个数字,我必须给例如5 3 *input,但它不是写作。

为什么不从命令行接受*

这是因为*是一个shell通配符:它对shell有一个特殊的含义,它在将它传递给命令(在本例中为java )之前展开它。

既然你需要一个文字* ,你需要将它从shell中转义出来。 转义的确切方式取决于您的shell,但您可以尝试:

 java ProgramName 5 3 "*" 

要么:

 java ProgramName 5 3 \* 

顺便说一句,如果你想知道shell用*做什么,试试把String[] args的内容打印到你的main方法中。 你会发现它将包含你的目录中的文件的名称。

如果您需要传递一些文件名作为命令行参数,这可能会很方便。

也可以看看

  • 维基百科:glob

    例如,如果一个目录包含两个文件a.logb.log那么命令cat *.log将被shell扩展为cat a.log b.log

  • 维基百科:转义字符

    在Bourne shell( sh )中,星号( * )和问号( ? )字符是通过globbing扩展的通配符。 如果没有前面的转义字符, *会扩展到工作目录中所有不以句号开头的文件的名称,当且仅当存在这样的文件时,否则*扩展。 所以要引用一个字面上被称为"*"的文件,必须告诉shell不要以这种方式解释它,通过在前面加一个反斜杠( \ )。

*在shell解释器中有特殊的含义。 如何从字面上得到*取决于你正在使用的shell解释器。 对于Bash,你应该把单引号放在*,即“*”,而不是像“*”这样的双引号。

尝试围绕"*"引号。 星号是命令行上的保留符号。

在MS WINDOWS下不太正确:“java.exe”默默地扩展了通配符的命令行参数

  • *
  • [ABC]

,但只在最后一个组件中,所以

 a/*/* 

不像你所期望的那样工作。

它也忽略了条目“。” 和“..”,但不尊重以“。”开头的其他文件名。

为了避免误解:如果我用PROCEXP查看正在运行的JAVA进程的命令行,我会看到未展开的参数!

我发现没有办法解决这个问题。 换句话说:只要在当前目录中至less有一个文件或目录,“java Calc 3 * 7”将不起作用!

这是非常丑陋的,似乎总是在所有JRE版本中,包括Java 8在内。

有没有人有一个想法如何禁用Java令人讨厌的命令行扩展?

使用单引号 :

 java FooBar 5 3 '*' 

这适用于大多数stream行的shell(包括bash和ksh)。