【问题标题】:How to preserve single and double quotes in shell script arguments WITHOUT the ability to control how they pass如何在 shell 脚本参数中保留单引号和双引号,而无法控制它们的传递方式
【发布时间】:2011-10-22 07:57:06
【问题描述】:

我需要在 shell 脚本中接收我无法控制的参数,并保留任何单引号或双引号。例如,一个简单地输出给定参数的脚本应该如下操作:

> my_script.sh "double" 'single' none
"double" 'single' none

我无权扩充以下参数:

> my_script.sh \"double\" \'single\' none

> my_script.sh '"double"' "'single'" none

“$@”和“$*”都不起作用。 我也想过从 STDIN 阅读并尝试类似:

> echo "double" 'single' none | my_script.sh

认为它可能会有所帮助,但到目前为止还没有突破。

有什么建议吗?

欢迎使用 CSH / PERL 解决方案。

【问题讨论】:

标签: shell arguments quotes sh


【解决方案1】:

这是不可能的(没有转义),因为 shell 在调用脚本之前会处理参数并删除引号。因此,您的脚本不知道命令行中指定的引号。

【讨论】:

    【解决方案2】:

    您无法完全恢复原样/双引号,因为外壳会“吃掉”它们。如果您需要从脚本中调用其他脚本,例如,您可以再次单引号参数。这是我使用的 PERL 解决方案:

    sub args2shell
    {
        local (@argv) = @_;
        local $" = '\' \'';
        local (@margv);
    
        @margv = map { s/'/'\\''/g; $_ } @argv;
        return "\'@margv\'" if @margv;
        return undef;   
    } 
    

    示例用法:

    $args = args2shell @ARGV;
    open F, "find -follow $args ! -type d |"; 
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-10-31
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多