*在命令行参数中的问题
我用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.log
和b.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)。