【问题标题】:Perl command-line script and shell variables: How to quote?Perl 命令行脚本和 shell 变量:如何引用?
【发布时间】:2014-07-26 09:19:34
【问题描述】:

我有一个像这样调用 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.

在外壳中。用单引号将 Perl 脚本括起来会导致结果为空。像\$perl_var 一样转义也不成功。

【问题讨论】:

标签: perl variables unix quotes


【解决方案1】:

您正试图将 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

【讨论】:

    【解决方案2】:

    你可以将你的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 命令缺少用于赋值的显式“=”。 Perl 可以从 %ENV 哈希中获得环境变量,变量名作为其键。

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 1970-01-01
        • 2014-08-06
        • 2016-04-24
        • 2015-04-19
        • 2014-11-21
        • 2017-09-07
        • 1970-01-01
        • 2016-06-19
        相关资源
        最近更新 更多