命令行参数中*的问题

时间:2010-04-27 05:15:06

标签: wildcard command-line-arguments glob

我用Java编写了一个程序,它通过命令行参数接受输入。 我从命令行输入两个数字和一个运算符。 要将两个数字相乘,我必须提供输入,例如5 3 *,但它没有按照书面形式工作。

为什么它不接受命令行中的*

5 个答案:

答案 0 :(得分:28)

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

由于您需要文字*,因此需要将其从shell中删除。转发的确切方式因shell而异,但您可以尝试:

java ProgramName 5 3 "*"

或者:

java ProgramName 5 3 \*

顺便说一下,如果你想知道shell对*的作用,请尝试将String[] args的内容打印到main方法。您会发现它将包含目录中文件的名称。

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

另见

  • Wikipedia: glob

      

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

  • Wikipedia: Escape character

      

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

答案 1 :(得分:4)

*在shell解释器中有特殊含义。如何获得*字面意思取决于您使用的shell解释器。对于Bash,你应该在*周围加上单引号,即'*',而不是像“*”这样的双引号。

答案 2 :(得分:3)

在MS WINDOWS下不完全正确:“java.exe”使用通配符静默扩展命令行参数

  • *
  • [ABC]

,但仅限于最后一个组件,所以

a/*/*

无法正常工作。

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

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

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

这非常难看,而且似乎一直存在于所有JRE版本中,包括Java 8。

有没有人知道如何禁用Java令人讨厌的命令行扩展?

答案 3 :(得分:2)

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

答案 4 :(得分:1)

使用single quotes

java FooBar 5 3 '*'

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