【问题标题】:Handling Perl command line arguments with spaces from a bash script?使用 bash 脚本中的空格处理 Perl 命令行参数?
【发布时间】:2011-07-08 20:17:56
【问题描述】:

这已经让我发疯了好几个小时了。

考虑一下 perl 中的以下测试脚本: (你好.pl)

#!/usr/bin/perl
print "----------------------------------\n";
$numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments:\n";

foreach $argnum (0 .. $#ARGV) {
    print "$ARGV[$argnum]\n";
}

好的,它只是打印出给脚本的命令行参数。

例如:

$ ./hello.pl apple pie
----------------------------------
thanks, you gave me 2 command-line arguments:
apple
pie

我可以通过用双引号将单词括起来给脚本一个带空格的参数:

$ ./hello.pl "apple pie"
----------------------------------
thanks, you gave me 1 command-line arguments:
apple pie

现在我想在 shell 脚本中使用这个脚本。我已经像这样设置了 shell 脚本:

#!/bin/bash

PARAM="apple pie"
COMMAND="./hello.pl \"$PARAM\""

echo "(command is $COMMAND)"
$COMMAND

我使用相同的参数和转义引号调用 hello.pl。 该脚本返回:

$ ./test.sh 
(command is ./hello.pl "apple pie")
----------------------------------
thanks, you gave me 2 command-line arguments:
"apple
pie"

尽管 $COMMAND 变量回显命令的方式与我第二次从命令行运行 perl 脚本的方式完全一样,但这一次它不想将苹果派视为单个参数。

为什么不呢?

【问题讨论】:

    标签: perl bash unix


    【解决方案1】:

    2个命令行参数的问题

    "apple
    pie"
    

    是由于外壳扩展,将 IFS 外壳变量设置为具有空格作为值。

    printf '%q\n' "$IFS"   # show value of IFS variable
    

    您可以使用 xargs & sh -c '...code...' 来模拟/重新启用普通参数解析。

    PARAM="'apple pie'"
    printf '%s' "$PARAM" | xargs sh -c './hello.pl "$@"' argv0
    

    另一种选择可能是编写几行 C 代码(如在 shebang.c 中)!

    http://www.semicomplete.com/blog/geekery/shebang-fix.html

    【讨论】:

      【解决方案2】:

      您应该尝试eval $COMMAND 而不是简单的$COMMAND

      【讨论】:

        【解决方案3】:

        这看起来像 Bash FAQ 中描述的问题:I'm trying to put a command in a variable, but the complex cases always fail!

        该常见问题解答的答案提出了许多可能的解决方案 - 我希望这是有用的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 2012-08-05
          • 1970-01-01
          • 1970-01-01
          • 2014-03-28
          • 2014-06-28
          • 1970-01-01
          相关资源
          最近更新 更多