我试图在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
)?
由于
答案 0 :(得分:1)
Windows环境变量标识符与Windows文件的方式无关。
Titi
和TITI
都是同一个变量的名称,其值可以通过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