这让我疯了好几个小时。
在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脚本的方式完全相同,但这次它不希望将苹果派视为单个参数。
为什么不呢?
答案 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中一样)!
答案 2 :(得分:0)
您应该尝试使用eval $COMMAND
,而不仅仅是$COMMAND
。