尝试将脚本参数传递给外部程序(以 ksh 为单位)时,我遇到了一些奇怪的行为。
我的设置是这样的:- 我有一个 ksh 脚本(称为"测试"),归结为这样:
...
args="$@"
java my_main_class $args
...
- 如果我用类似的东西调用这个脚本:
> ./test "param1 param2" param3
。然后外部应用程序看到以下参数:(参数1,参数2,参数3)
如果我将脚本更改为类似以下内容:
... java my_main_class "$@" ...
。并执行相同的调用,然后我的外部应用程序会看到以下参数(param1 param2,param3) - 这意味着现在正确查看参数。
问题:在外部程序调用之前,如何修改脚本的第一个版本,以便正确传递包含空格的参数,同时仍将"@$"存储到变量中?
亲切问候安德烈
首先,让我们设置相同的会话:
$ 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