我有一个调用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
这样的转义也不会成功。
答案 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