Jen*_*nny 4 java shell cmd wildcard
我在java中编写了最简单的计算器来获取命令行参数.除了乘法函数之外,一切正常.出于某种原因,它从当前位置获取文件的名称.我完全不知道为什么会这样,以及如何关闭它...谷歌没有帮助.
public class Calculate {
public static void main(String[] args) {
System.out.println(args[0] + " " + args[1] + " " + args[2]);
if (args.length != 3) {
System.out.println("<number1> <operator> <number2>");
} else {
final int num1 = Integer.parseInt(args[0]);
final int num2 = Integer.parseInt(args[2]);
switch (args[1]) {
case "+":
System.out.println(num1 + num2);
break;
case "-":
System.out.println(num1 - num2);
break;
case "*":
System.out.println(num1 * num2);
break;
case "/":
System.out.println(num1 / num2);
break;
}
System.out.println("\n");
}
}
}
Run Code Online (Sandbox Code Playgroud)

这与java无关,但是使用命令行,您需要使用:
java Calculate 2 "*" 3
Run Code Online (Sandbox Code Playgroud)
原因是*命令行将其解释为通配符:它被文件夹中的所有文件替换,幸运的是只有一个这样的文件.它是几乎所有(基本)shell的默认行为.如果你在single('*')或double("*")引号之间编写它,shell不会解释它,而是将它作为一个字符传递.
所以基本上发生的是你的电话被cmd替换为:
java Calculate 2 <files in the directory> 3
Run Code Online (Sandbox Code Playgroud)
换句话说,java甚至不知道你曾经使用过通配符,因为在你调用程序之前它已经被替换了.
可以在这里找到更多信息(虽然该网站是为Linux shell 设计的,但这些想法一般适用).
编辑
正如@PatriciaShanahan所说,您也可以将整个表达式放在引号中,例如:
java Calculate "2 * 3"
Run Code Online (Sandbox Code Playgroud)
但是请注意,在这种情况下,args[0]将包含"2 * 3"(和长度args会1,所以你不能从外壳部分的解析表达式取收益),因此你需要将串细分成零件自己.而且你不要完全放弃引号.
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |