命令行参数的问题,其中包含空格

时间:2013-07-12 16:42:05

标签: java

我遇到了一个奇怪的问题,经过大量的调试,我找到了理由的原因。 我有一个Java程序,我通过bash脚本在Linux环境中执行。

这是我的简单bash脚本,它接受一个String。

#!/bin/bash
java -cp  com.QuoteTester $1

问题是命令行参数可以是Spaces还是Without Space。 例如,它可以是

Apple Inc. 2013 Jul 05 395.00 Call   

OR

Apple

根据我的代码就是这样

public static void main(String[] args) 
{
String symbol = args[0];

if (symbol.trim().contains(" ")) // Option
{

}

else  // Stock 
{

}

所以问题是,当我试图以这种方式执行时

./ quotetester Apple Inc. 2013年7月05日395.00致电

它只会始终转到else condition即股票。

无论如何我能解决这个问题吗?

5 个答案:

答案 0 :(得分:18)

当您使用空格传递命令行参数时,它们将被视为空格分隔的参数,并在空间上进行分割。所以,你实际上没有一个参数,而是多个参数。

如果要使用空格传递参数,请使用引号:

java classname "Apple Inc. 2013 Jul 05 395.00 Call"

答案 1 :(得分:7)

这不是Java问题本身。这是一个shell问题,适用于您使用此类参数调用的任何内容。你的shell正在拆分参数并将它们分别提供给Java进程。

你必须引用这些参数,以便shell不会拆分它们。 e.g。

$ java  -cp ... "Apple Inc. 2013"

等。 请参阅here for a longer discussion

答案 2 :(得分:1)

参数由shell处理,因此任何终端设置都不应影响这一点。你只需要引用参数就应该有效。

答案 3 :(得分:0)

单引号是最佳选择

可以用这种方式解决空格和双引号。

java QuerySystem '((group = "infra") & (last-modified > "2 years ago"))' 

答案 4 :(得分:0)

在原始问题中,OP使用的是Shell脚本来调用Java命令行,并且希望Shell脚本在不执行输入解释的Blank解释(分词)选项的情况下传递参数。 https://rg1-teaching.mpi-inf.mpg.de/unixffb-ss98/quoting-guide.html#para:sh-ifs

如果您知道有多少个参数,则可以将参数用双引号

#!/bin/bash
java -cp  com.QuoteTester "$1"

因此,您将此脚本称为另存为quotetester.sh。

./quotetester.sh "hello world" 

和“ hello world”作为单个参数传递给Java。您也可以使用

./quotetester.sh hello\ world 

具有相同的效果。