Perl命令行脚本和shell变量:如何引用?

时间:2014-06-05 11:38:13

标签: perl variables unix quotes

我有一个调用Perl的shell脚本(csh),如下所示:

set SHELL_VAR = "foo"
set RES = `perl -e 'my $perl_var = uc("$SHELL_VAR"); print "$perl_var\n"'`
echo $RES

无论我尝试过哪种组合,我都无法正确使用单引号或双引号。

如何在Perl和shell中正确混合变量?

两者都以$开头。双引号使用变量值,但返回

  

错误perl_var: Undefined variable.

在shell中。用单引号括起Perl脚本导致结果为空。像\$perl_var这样的转义也不会成功。

3 个答案:

答案 0 :(得分:2)

您正在尝试将shell var的值插入到命令行中的程序的Perl文字中。这是逃脱的两个层次!相反,只需将它作为参数传递给Perl。

% set SHELL_VAR = "foo"
% set RES = `perl -e'print uc($ARGV[0])' "$SHELL_VAR"`
% echo "$RES"
FOO

卫生署!这不太对劲。

csh% set SHELL_VAR = foo\"\'\(\ \ \ \$bar
csh% set RES = `perl -e'print uc($ARGV[0])' "$SHELL_VAR"`
csh% echo "$RES"
FOO"'( $BAR

我应该

FOO"'(   $BAR

sh中,我使用RES="` ... `"又名"$( ... "),但我不知道csh等价物。如果有人可以修复上述内容以便打印多个空格,我会很感激!

sh$ shell_var=foo\"\'\(\ \ \ \$bar
sh$ res="$( perl -e'print uc($ARGV[0])' "$shell_var" )"
sh$ echo "$res"
FOO"'(   $BAR

答案 1 :(得分:1)

您可以将SHELL_VAR推入环境,让Perl从那里拉出来:

#!/bin/csh
setenv SHELL_VAR "foo"
set RES = `perl -e 'my $perl_var = uc($ENV{SHELL_VAR}); print "$perl_var\n"'`
echo $RES

请注意,setenv命令缺少expicit' ='作业。环境变量可以从%ENV哈希中获得Perl,变量名称作为其键。

答案 2 :(得分:0)

我找到了另一个解决方案,你可以简单地连接几个表达式,即你可以写

set XYZ = "foo"`date`bar$HOST'gugus'
例如,

。这是

的串联
foo + `date` + bar + $HOST + gugus

因此以下工作:

set SHELL_VAR = "foo"
set RES = `perl -e 'my $perl_var = uc("'$SHELL_VAR'"); print "$perl_var\n"'`
echo $RES