我有一个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\"");
}
}
答案 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"
$