将参数从shell脚本传递到perl程序不会';t保持空间

将参数从shell脚本传递到perl程序不会';t保持空间,perl,shell,Perl,Shell,我有一个perl脚本test.pl,它从命令行读取参数 #!/usr/bin/perl -w for( @ARGV ) { print( "$_\n" ) } ; 当我在命令行上传递诸如“ab”“cd”e之类的参数时,这种方法效果很好 结果是: a b c d e 如果我声明一个变量 X='"a b" "c d" e' 然后跑 test.pl $X 我明白了 我需要从各种shell脚本中运行perl脚本作为帮助函数,这些脚本计算参数。 参数计数不是固定的,因此我必须将其作为列表传递。

我有一个perl脚本test.pl,它从命令行读取参数

#!/usr/bin/perl -w  
for( @ARGV ) { print( "$_\n" ) } ;
当我在命令行上传递诸如“ab”“cd”e之类的参数时,这种方法效果很好
结果是:

a b
c d
e
如果我声明一个变量

X='"a b" "c d" e'
然后跑

test.pl $X
我明白了

我需要从各种shell脚本中运行perl脚本作为帮助函数,这些脚本计算参数。
参数计数不是固定的,因此我必须将其作为列表传递。
唉,我找不到让perl程序按需要处理我的参数的方法。
我曾想过通过文件传递参数,但随后从命令行手动调用perl脚本变得很尴尬。

如何让Perl脚本保留参数中的空格?

如果使用BASH,可以考虑使用AN来保存参数,以防止在变量被替换为Test.PL < /Cult>命令调用时:信息丢失:

declare -a X=("a b" "c d" e)
test.pl "${X[@]}"
如果有帮助,您可以逐块构建阵列:

X=("a b")
X+=("c d")
X+=("e")

问题在于外壳。执行

./test.pl "$X"
将为shell提供一个参数。一种解决办法是使用

/bin/bash -c "./test.pl $X"
嗯 乔治

谢谢@all的提示。 从shell传递参数似乎不像我想象的那么容易。 因此,我在perl程序中添加了另一个参数,它告诉程序从文件而不是命令行读取参数。
这与所需的类似,并避免了shell解释。

perl
脚本中传递的参数保存在
@ARGV
数组中
因此,当您打印时,它会从该数组中给出值,并将其打印为不同的参数,因为它不会保留参数之间的空间,空格用于标识不同的参数。在命令行上传递参数的可能重复项可以正常工作,正如我上面所描述的。不起作用的是通过变量传递参数。在命令行上传递参数可以正常工作,正如我上面所描述的。因此,这不是上述问题的重复。我认为您有语法错误,您是指
/test.pl“$X”
还是
/usr/bin/perl test.pl“$X”
。您完全正确。否则,这只在test.pl位于路径中时才起作用。我猜我用bash尝试了数组,它起作用了。不幸的是,为了向后兼容,我需要使用ksh,但它在那里不起作用。因此,我正在寻找一种简单的方法来让我的perl程序区分来自STDIN的输入(我将使用它从ksh脚本调用)和来自命令行参数的输入(我将使用这些参数进行交互调用)。您使用的是哪一版本的Korn shell?也许值得为这个问题添加细节。
/bin/bash -c "./test.pl $X"