如何用Perl的while循环生成正确格式的mgmt_cli安装策略命令
Perl脚本修正方案
原脚本的问题
- 一次性读取所有行到数组的写法导致循环仅执行一次,且文件中的空行被误当作有效站点。
chomp操作仅作用于剩余数组元素,未处理实际用到的$var1、$var2变量,导致这两个变量保留了换行符,最终生成的命令里包含无效换行。
修正后的脚本
#!/usr/bin/perl use strict; use warnings; my $file = '/var/log/scripts/clusters_ips.txt'; open my $info, $file or die "Could not open $file: $!"; # 读取所有行,过滤空行(含仅空白字符的行) my @sites; while (my $line = <$info>) { chomp $line; next if $line =~ /^\s*$/; # 跳过空行或全空白行 push @sites, $line; } close $info; # 生成targets参数部分 my @target_args; for my $i (0 .. $#sites) { my $index = $i + 1; # targets从1开始计数 push @target_args, "targets.$index \"$sites[$i]\""; } # 拼接完整命令 my $cmd = "mgmt_cli install-policy policy-package \"Site-Firewalls\" access false threat-prevention true " . join(' ', @target_args); # 执行命令并保存输出 my $cmdout = `$cmd`; print $cmd, "\n"; # 打印生成的命令用于验证 # 可根据需求处理$cmdout,如打印或写入日志
说明
- 逐行读取文件,用
chomp去除每行换行符,同时跳过空行,确保@sites数组仅保留有效站点名称。 - 遍历
@sites自动生成对应格式的targets.N参数,无需手动写死数量,适配2个或3个站点的场景。 - 拼接所有参数形成完整命令,彻底避免换行符混入问题。
内容的提问来源于stack exchange,提问作者user1026398
相关产品推荐
相关产品推荐

