【发布时间】:2017-06-20 17:31:31
【问题描述】:
我正在用 Perl 重写一个 bash 脚本。
原始脚本检查 Linux 软件包是否处于未配置状态,如果是,则删除并重新安装。
#!/bin/bash
if [[ $(dpkg -l | grep libc-bin | grep iF) || $(dpkg -l | grep libc-dev-bin | grep iU) ]] ; then
echo "do something"
fi
我开始查看是否可以使用系统调用并将它们存储为变量,然后只运行这些多个变量的if 语句。这似乎不起作用。
#!/usr/bin/perl
my $libcUnconfigured = system("dpkg -l | grep libc-bin | grep iF");
my $libcDevUnconfigured = system("dpkg -l | grep libc-dev-bin | grep iF");
if ( $libcUnconfigured || $libcDevUnconfigured ) {
print "Do something";
}
【问题讨论】:
-
system返回返回码,而不是输出。请改用qx//。 -
你为什么在 perl 中使用 grep?
-
获取包列表:
my @libcUnconfigured = grep { /libc-bin|iF/ } qx(dpkg -l)。qx("backticks") 返回一个列表,grep过滤后得到一个列表(数组)。qx使用/bin/sh或系统为其提供的任何内容,因此您可能需要指定命令路径 -
@Borodin 现在无法解决...可能在一小时或几个小时内完成,除非届时有人将其覆盖。 (也很高兴从 OP 那里知道该评论是否足够。)如果您愿意,请务必回答。抱歉延迟回复
-
这是一个坏主意。 Shell 提供了安全执行代码的工具——如果变量中有名称,则可以引用
"$var"(引号),并确保它只会计算其文字内容——没有转义,没有重定向,没有命令替换或任意代码执行。当您开始从其他 shell 语言生成和执行 shell 脚本时,您需要竭尽全力从代码中带外传递数据,以保持同样的安全保证。因此,用其他语言包装 shell 脚本本身就容易出错,除非 100% 硬编码。
标签: bash perl if-statement conditional system