在Perl中设置区分大小写的Windows环境变量

时间:2015-01-20 09:14:24

标签: windows perl shell msys

我试图在Perl中设置一些具有区分大小写的Windows环境变量,以便在shell脚本中使用它们。

但是,当我尝试在带有system命令的Perl调用的shell脚本中以小写形式使用它们并使用Msys运行时,我注意到环境变量都是大写的。

例如,以下脚本:

#!perl

system "echo echo TOTO=\$TOTO > toto.sh";
system "echo echo Titi=\$Titi >> toto.sh";
system "echo echo TITI=\$TITI >> toto.sh";
$ENV{'TOTO'}="0+0";
$ENV{'Titi'}="Not toto!";
system("sh toto.sh");

返回(在Msys中运行时)以下输出:

TOTO=0+0
Titi=
TITI=Not toto!

有人知道这是否可以在Windows中使用(即如何设置环境变量Titi而不是TITI)?

由于

3 个答案:

答案 0 :(得分:1)

Windows环境变量标识符与Windows文件的方式无关。

TitiTITI都是同一个变量的名称,其值可以通过Perl中的$ENV{TITI}$ENV{Titi}来获取。同样,命令行上的echo %TITI%echo %Titi%也会给出相同的结果。

如果您解释为什么需要区分大小写的环境变量名称,那么我们可以帮助您。

答案 1 :(得分:0)

以下内容应与套管问题无关。

让我们走第一行:

system "echo echo TOTO=\$TOTO > toto.sh";

如果你打电话

echo echo TOTO=\$TOTO

在命令行上,输出为:

echo TOTO=\$TOTO

似乎是,你想要什么。

但是,您使用系统调用的行首先由perl解释,因此转义的\ $变为$。

然后输出取决于$ TOTO的当前值(在脚本中设置环境变量之前),这可能是空的。

您应该将所有系统调用更改为单引号:

 system 'echo echo TOTO=\$TOTO > toto.sh';

如果这样做,您将获得以下输出:

TOTO=0+0
Titi=
TITI=not TOTO

Titi是空的,因为你没有给它赋值。

答案 2 :(得分:0)

似乎无法做到:Windows只会使用大写变量。

我采用的方法是通过用大写等效项替换变量来临时转换脚本,并在使用它们后将它们切换回以前的状态。

就我而言,我必须处理从shell脚本Run_Session.sh导出的变量。我已经创建了一个Perl脚本来执行大写替换,这就是结果。

###############################
## SUBROUTINE uc_variables   ##
#-----------------------------#
# This subroutine convert the environment variables exported 
# by the top level script to upper case, and can revert the operation.
#
# Input:
# -----
# $mode: "ON" (default) or "OFF"
#
# Output:
# ------
# N/A
#-----------------------#
#########################
sub uc_variables {
    my $mode=shift;
    chdir $Bin;
    if ($mode eq "OFF") {
        foreach my $bak (glob "{*,*/*}.sh.bak") {
            (my $orig = $bak)=~s/\.bak//;
            move($bak,$orig);
        }
    } else {
        #Check if back-up already exists
        uc_variables("OFF") if (-e "Run_Session.sh.bak");
        #List variables to update
        my %uc_var;
        open RUN_SESSION,"<Run_Session.sh" or die "Error while reading Run_Session.sh ($!)\n";
        map { /export\s+(\w*[a-z]\w*)/ and ($uc_var{$1}=uc($1))=~s/Directory/DIR/i } <RUN_SESSION>;
        close RUN_SESSION;
        #Replace variables
        foreach my $shell (glob "{*,*/*}.sh") {
            #Back-up
            copy($shell,"$shell.bak");
            #Read data
            open SHELL,"<$shell" or die "Error while reading $shell ($!)\n";
            my $SHELL = join("", <SHELL>);
            close SHELL;
            #Replace
            map { $SHELL=~s/$_/$uc_var{$_}/g } keys %uc_var;
            #Print
            open SHELL,">$shell" or die "Error while writing in $shell ($!)\n";
            print SHELL $SHELL;
            close SHELL;
        }
    }
} #end of uc_variables