使用bash脚本中的空格处理Perl命令行参数?

时间:2011-03-04 13:41:38

标签: perl bash unix

这让我疯了好几个小时。

在perl中考虑以下测试脚本: (hello.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脚本的方式完全相同,但这次它不希望将苹果派视为单个参数。

为什么不呢?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

2个命令行参数的问题

"apple
pie"

是由于shell扩展,IFS shell变量被设置为具有空格作为值。

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 :(得分:0)

您应该尝试使用eval $COMMAND,而不仅仅是$COMMAND