我用Java编写了一个程序,它通过命令行参数接受输入。
我从命令行输入两个数字和一个运算符。
要将两个数字相乘,我必须提供输入,例如5 3 *
,但它没有按照书面形式工作。
为什么它不接受命令行中的*
?
答案 0 :(得分:28)
那是因为*
是一个shell通配符:它对shell有特殊含义,在将它传递给命令之前扩展它(在本例中为java
)。
由于您需要文字*
,因此需要将其从shell中删除。转发的确切方式因shell而异,但您可以尝试:
java ProgramName 5 3 "*"
或者:
java ProgramName 5 3 \*
顺便说一下,如果你想知道shell对*
的作用,请尝试将String[] args
的内容打印到main
方法。您会发现它将包含目录中文件的名称。
如果您需要将一些文件名作为命令行参数传递,这可能很方便。
例如,如果某个目录包含两个文件
a.log
和b.log
,那么命令cat *.log
将由shell扩展为cat a.log b.log
在Bourne shell(
sh
)中,星号(*
)和问号(?
)字符是通过globbing扩展的通配符。如果没有前面的转义字符,*
将扩展为工作目录中不以句点开头的所有文件的名称,当且仅当存在此类文件时,否则*
仍未展开。因此,要引用一个字面上称为"*"
的文件,必须告诉shell不要以这种方式解释它,前面加上反斜杠(\
)。
答案 1 :(得分:4)
*在shell解释器中有特殊含义。如何获得*字面意思取决于您使用的shell解释器。对于Bash,你应该在*周围加上单引号,即'*',而不是像“*”这样的双引号。
答案 2 :(得分:3)
在MS WINDOWS下不完全正确:“java.exe”使用通配符静默扩展命令行参数
,但仅限于最后一个组件,所以
a/*/*
无法正常工作。
它也忽略条目“。”和“..”,但确实尊重以“。”开头的其他文件名。
为避免误解:如果我使用PROCEXP查看正在运行的JAVA进程的命令行,我会看到未扩展 args!
我发现无法解决这个问题。换句话说:只要当前目录中至少有一个文件或目录,“java Calc 3 * 7”就不起作用了!
这非常难看,而且似乎一直存在于所有JRE版本中,包括Java 8。
有没有人知道如何禁用Java令人讨厌的命令行扩展?
答案 3 :(得分:2)
尝试使用引号*
围绕"*"
。星号是命令行上的保留符号。
答案 4 :(得分:1)