在perl脚本中的bash命令中包含一个perl变量
例如:在perl脚本中的bash命令中包含一个perl变量,bash,shell,perl,Bash,Shell,Perl,例如: #!/usr/bin/perl ... my $host = $db_conf->{host}; my @cmd = ('date',$host); system(@cmd); 因此,我期待的结果是: Fri Aug 11 15:41:28 CST 2017 db-test-1 其中db-test-1是主机名 这是我的全部代码: #!/usr/bin/perl use strict; use warnings; use 5.010; use DBI; use Encode;
#!/usr/bin/perl
...
my $host = $db_conf->{host};
my @cmd = ('date',$host);
system(@cmd);
因此,我期待的结果是:
Fri Aug 11 15:41:28 CST 2017 db-test-1
其中db-test-1是主机名
这是我的全部代码:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use DBI;
use Encode;
use IO::File;
use JSON;
use utf8;
BEGIN {
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';
}
INIT {
my @databases = </kkcorp/kksecret/db-*/db.json>;
foreach my $filename (@databases) {
my $fh = IO::File->new($filename, 'r') or croak $!;
my @buf = <$fh>;
my $str = join '', @buf;
$fh->close;
my $db_conf = decode_json $str;
my $entry = int(rand(scalar(@{$db_conf})));
$db_conf = $db_conf->[$entry]->{writer}->{params};
my $host = $db_conf->{host};
my $dbname = $db_conf->{dbname};
my $password = $db_conf->{password};
my $username = $db_conf->{username};
my $wsrep_check = `mysql -h $host -u $username -p$password < /authdir/auto_inc_script.sql`;
$hosti
if (index($wsrep_check, 'Value: Synced') != -1) {
my @cmd = ('date ${host}');
system(@cmd);
my @wsrep_check_lines = split /\n/, $wsrep_check;
my @table_name = grep { /Synced/ } @wsrep_check_lines;
for my $line (@table_name){
say STDERR $line;
}
say '';
}
}
}
__END__
系统
非常强大,但也非常危险。如果你用<代码> RM来给它带来灾难,那么如果你完全清楚了,在运行<代码>系统< /代码>之前,什么参数<代码> RM>代码>就更好了。
因此,我始终遵循以下做法:
系统
部件perl-e'$var=“Hello”$cmd=qq(echo$var);打印“命令:$cmd\n”;系统($cmd);'代码>打开
使用严格代码>使用警告代码>。检查错误是怎么说的。发布一些输出。发布更多细节,因为我们不知道db_conf是什么。但是我很确定你的系统
命令是错误的,因为日期本地主机
错误和无效日期
。我已经添加了完整的代码,并解释了我试图实现的更多内容。你的my@cmd=('date${host}')
有单引号,因此${host}
不会被插值。后面的系统
运行date${host}
。这不是你想要的,对吧?除此之外,从描述中我不明白问题在哪里。。。在mysql..
中,当我使用双引号而不是单引号时,会出现错误“date:invalid date…”,但是date${host}
的意义是什么?什么是${host}
?既然$host
来自DB,它是否应该被插值?如果是,则最好使用date
命令所期望的日期格式。但是按照您的方式,您运行date
,然后是一个(假定的)变量${host}
,该变量应该存在于您的环境中。。。真的吗?我理解系统()的危险性。无论如何,当我运行echo$(date)时,它会显示日期。但是,当我运行您建议的命令,将字符串“hello”替换为$(date)时,它不会打印日期。例如,perl-E'$var=“$(日期);$cmd=qq(echo$var);print\“命令:$cmd\n\”;“试试这个:perl-E'$date=qx(日期);chomp$date;$cmd=qq(echo“$date”);print“cmd is:$cmd\n”;system($cmd);”
Fri Aug 11 17:13:19 CST 2017
ok Value: Synced
Fri Aug 11 17:13:20 CST 2017
ok Value: Synced