13

我有一个通过 bash 脚本在 Linux 环境中执行的 Java 程序。

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

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

问题是命令行参数可以带有空格或不带空格。

例如,它可以是:

Apple Inc. 2013 Jul 05 395.00 Call   

或者

Apple

我的代码是:

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

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

    }

    else  // Stock 
    {

    }
}

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

./quotetester Apple Inc. 2013 Jul 05 395.00 Call

它唯一总是去else condition那是 Stock 。

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

4

5 回答 5

24

当您传递带有空格的命令行参数时,它们被视为空格分隔的参数,并按空格分隔。因此,您实际上没有一个参数,而是多个参数。

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

java classname "Apple Inc. 2013 Jul 05 395.00 Call"
于 2013-07-12T16:43:59.667 回答
10

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

您必须引用参数,以便外壳不会将它们分开。例如

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

等请参阅此处进行更长的讨论

于 2013-07-12T16:44:28.810 回答
1

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

于 2013-07-12T16:46:40.190 回答
0

在原始问题中,OP 使用 shell 脚本调用 java 命令行,并希望 shell 脚本在不执行输入解释的空白解释(分词)选项的情况下传递参数 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 

具有相同的效果。

于 2020-08-11T14:42:27.207 回答
0

单引号是最好的选择

空格和双引号可以这样解决。

java QuerySystem '((group = "infra") & (last-modified > "2 years ago"))' 
于 2018-09-27T23:31:18.413 回答