【问题标题】:Correctly passing parameters containing space, to external program正确地将包含空格的参数传递给外部程序
【发布时间】:2012-11-13 23:03:45
【问题描述】:

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

我的设置是这样的: - 我有一个 ksh 脚本(称为“测试”),可以归结为如下内容:

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

- 如果我用类似这样的方式调用这个脚本:

> ./test "param1 param2" param3

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

  • 如果我将脚本更改为:

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

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

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

亲切的问候, 安德烈

【问题讨论】:

    标签: bash sh ksh


    【解决方案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

    【讨论】:

    • 旧的语法是set -A args="$@"
    • 谢谢伙计,这看起来是正确的。会给它一个旋转并回复你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2023-03-21
    • 2014-08-20
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多