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

Sym*_*ans 5 unix bash perl

这让我疯了好几个小时了.

在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";
}
Run Code Online (Sandbox Code Playgroud)

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

例如:

$ ./hello.pl apple pie
----------------------------------
thanks, you gave me 2 command-line arguments:
apple
pie
Run Code Online (Sandbox Code Playgroud)

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

$ ./hello.pl "apple pie"
----------------------------------
thanks, you gave me 1 command-line arguments:
apple pie
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

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

echo "(command is $COMMAND)"
$COMMAND
Run Code Online (Sandbox Code Playgroud)

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

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

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

为什么不?

Mar*_*air 6

这看起来像Bash FAQ中描述的问题:我试图将命令放在变量中,但复杂的情况总是失败!

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