正确地将包含空格的参数传递给外部程序

时间:2012-11-26 13:00:31

标签: bash sh ksh

尝试将脚本参数传递给外部程序时,我遇到了一些奇怪的行为,在ksh中。

我的设置是这样的: - 我有一个ksh脚本(称为“测试”),归结为这样的事情:

...
args="$@"
java my_main_class $args
...

- 如果我用以下内容调用此脚本:

> ./test "param1 param2" param3

...然后外部应用程序看到以下参数:(param1,param2,param3)

  • 如果我将脚本更改为:

    ...
    java my_main_class "$@"
    ...
    

...并执行相同的调用,然后我的外部应用程序会看到以下参数(param1 param2,param3) - 这意味着现在可以正确看到参数。

问题:如何在外部程序调用之前修改我的第一个脚本版本,以便正确传递包含空格的参数,同时仍将“@ $”存储到变量中?

亲切的问候, 安德烈

1 个答案:

答案 0 :(得分:1)

首先,让我们设置相同的会话:

$ set -- "param1 param2" param3
$ echo $1, $2

param1 param2, param3

ksh和bash提供了一个带有数组赋值的有效解决方案:

$ args=("$@")
$ fake_java() { ( for w; do echo "$w"; done ); }

如果没有引用,这仍然会失败:

$ fake_java ${args[@]}

param1

param2

param3

但引号和数组相结合使得这项工作:

$ fake_java my_main_class "${args[@]}"

param1 param2

param3