2

我有一个带有以下输出的 Java 类:

"Roses are red" "Violets are blue" "Daisies are white"

我正在尝试创建一个执行此 Java 类的 KornShell (ksh) 脚本,将结果存储到一个数组中,然后输出

Roses are red
Violets are blue
Daises are white

这是我第一次尝试脚本:

1 #!/bin/ksh
2 
3 set -A colors $(java Colors)
4 
5 for i in "${colors[@]}"
6 do
7     echo "$i"
8 done

但是,输出如下所示:

"Roses
are
Red"
"Violets
are
blue"
"Daisies
are
white"

当我抛出:

echo set -A colors $(java Colors)

进入脚本以查看正在调用的内容,它返回:

set -A colors "Roses are Red" "Violets are blue" "Daisies are white"

如果我用上面的第 3 行替换那个确切的输出,我会得到所需的输出:

Roses are red
Violets are blue
Daises are white

为什么命令替换会把整个事情扔掉?

如果有帮助,下面是 Java 类:

public class Colors {
    public static void main(String[] args) {
        System.out.println("\"Roses are Red\" \"Violets are blue\" \"Daisies are white\"");
    }   
}
4

4 回答 4

2

所以我最终通过在 set 命令前面抛出一个“eval”来使其工作。它看起来像这样:

1 #!/bin/ksh
2 
3 eval set -A colors $(java Colors)
4 
5 for i in "${colors[@]}"
6 do
7     echo "$i"
8 done

我不确定为什么这确实有效,但确实有效。

于 2013-07-12T03:08:18.060 回答
0

这种事情很难做到。这似乎有效:

$ cat roses
echo '"Roses are red" "Violets are blue" "Daisies are white"'
$ IFS='
> '                                       
$ set -A colors $(eval printf '%s\\n' $(./roses))
$ printf "%s\n" "${colors[@]}"                   
Roses are red
Violets are blue
Daisies are white
$ 

该脚本./roses与您的 Java 类执行相同的工作。变量IFS是字段间分隔符字符串;它设置为换行符(仅)。该set行创建一个数组colors。该值是您从执行和捕获中获得的eval printf '%s\\n' $(./roses)。第二printf条语句每行打印一个数组的元素。

ksh在 Mac OS X 10.8.4 上测试。

等价于bash

$ IFS='
> '
$ colors=($(eval printf '%s\\n' $(./roses)))
$ printf "%s\n" "${colors[@]}"
Roses are red
Violets are blue
Daisies are white
$

取决于 的版本bash,可能还有其他方法可以做到这一点。

$IFS你应该在践踏它之前保存并恢复它的价值。

$ old_ifs="$IFS"
$ IFS='
> '
$ ...use the modified value...
$ IFS="$old_ifs"
$
于 2013-07-12T00:47:54.300 回答
0

将您的 java 命令的输出作为参数传递给另一个 shell 脚本。

然后它会给出 $1=>"Roses are red",$2=>"Violets are blue",等等。

您可以使用 $@ 获取所有输入参数

于 2013-07-11T23:42:41.643 回答
0

您可以在以下位置使用引号$( )

set -A colors "$(java Colors)"

避免分词

于 2013-07-10T18:17:05.790 回答