如何将 CLI 参数组合为 perl 脚本中的变量

How to combine CLI arguments as variables within a perl script

我正在尝试编写一个基本上执行如下 cli 命令的脚本:

snmpget -v 1 -c xxxxxx-Ovq xx.xx.xx.xxx .1.3.6.1.2.1.1.8.0

其中 xxxxx 是密码,xx.xx.xx.xxx 和 IP 通常 returns:

49:22:12:15.00

我的脚本是:

#!/usr/local/bin/perl

#snmpget -v 1 -c xxxxx -Ovq xx.xx.xx.xxx .1.3.6.1.2.1.1.8.0

$SNMP_GET_CMD = "snmpget -v1 -c xxxxx-Ovq";
$SNMP_TARGET = "xx.xx.xx.xxx";

my $sysORLastChange = '${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0';
chomp($sysORLastChange);
print("${SNMP_TARGET} as an Input Line Reading of ${sysORLastChange}\n");

输出为:

xx.xx.xx.xxx as an Input Line Reading of ${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0

它应该return如下:

xx.xx.xx.xxx as an Input Line Reading of 49:22:12:15.00

我在脚本中使用的语法有问题吗?

在 Perl 中,使用双引号将另一个变量插入到字符串中。当您在单引号字符串中使用其他变量定义 $sysORLastChange 时,如下所示:

my $sysORLastChange = '${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0';

...正在逐字分配字符串(即内部变量未展开)。

要更正此问题,请使用双引号为变量赋值,这会将内部变量插入到它们的值中:

my $sysORLastChange = "${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0";

如果要实际执行字符串,可以使用 qx() 运算符,也就是 "backtick" 样式引号:

my $sysORLastChange = qx(${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0);

# or...

my $sysORLastChange = `${SNMP_GET_CMD} ${SNMP_TARGET} .1.3.6.1.2.1.1.8.0`;

参见 Perl Quote and Quote-like Operators in perlop