在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>代码>就更好了。 因此,我始终遵循以下做法:

  • 创建commad字符串
  • 打印命令字符串
  • 检查打印表示是否是我要发送到shell的内容
  • 添加
    系统
    部件
  • 下面是命令行中的一个示例:

    perl-e'$var=“Hello”$cmd=qq(echo$var);打印“命令:$cmd\n”;'

    接下来,添加系统:


    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