ksh命令用引号转换成数组

时间:2013-07-10 18:13:37

标签: java shell scripting ksh

我有一个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 个答案:

答案 0 :(得分: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

我不确定为什么这样做确切,但确实如此。

答案 1 :(得分:0)

您可以在$( )上使用引号:

set -A colors "$(java Colors)"

避免分词

答案 2 :(得分:0)

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

然后它会给$ 1 =>“玫瑰是红色的”,$ 2 =>“紫罗兰是蓝色的”,依此类推。

您可以使用$ @

获取所有输入参数

答案 3 :(得分: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语句每行打印一个数组元素。

在Mac OS X 10.8.4上使用ksh进行测试。

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"
$