有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ksh命令替换为数组中的引号

我有一个Java类,其输出如下:

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

我试图创建一个KornShell(ksh)脚本,它执行这个Java类,将结果存储到一个数组中,然后输出

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\"");
    }   
}

共 (2) 个答案

  1. # 1 楼答案

    因此,我通过在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
    

    我不确定这到底是为什么起作用,但确实起了作用

  2. # 2 楼答案

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

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

    根据^{}的版本,可能还有其他方法可以实现

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

    $ old_ifs="$IFS"
    $ IFS='
    > '
    $ ...use the modified value...
    $ IFS="$old_ifs"
    $