从命令输出匹配子串

时间:2011-07-19 17:36:50

标签: bash packages substring busybox

这个问题的一些候选人已经得到了回答,我尝试了几种尝试解决问题的方法。具体来说,我的情况是:

我有一个实用程序名称数组,可能安装在Linux机器上,也可能不安装(例如:ssh,sudo等),所以我试图根据尝试的结果检查实用程序是否存在依次调用实用程序。我试图用bash来做这件事。 Bash版本是在Ubuntu 10.10上运行的4.1.5(1),但计划在BusyBox上部署。

如果该实用程序不存在,那么通常会收到一条消息“未找到”或包含该确切的字符串。否则,您会收到一条使用消息。我已经为我使用的grep尝试了一些正则表达式,但它没有任何区别,这使我相信我的代码存在一些更根本的缺陷。

我完全清楚有些实用程序可以执行此操作,但是对于我正在使用的环境,我无法访问像dpkg这样的内容来检查实用程序/包。简而言之,我计划部署的环境没有包装管理。

我的内容大致如下:

#!/bin/bash
TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
#list of tools is abridged for convenience and added 'soodo' as a sure miss

#add a ridiculous option flag so don't accidentally trip any real flags
if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then
echo "${TOOLS[0]} is not installed."
else echo `${TOOLS[0]} --version`

#I am aware that --version is not applicable for all utilities, but this is just
#for sake of example.

我的问题是,似乎永远不会准确地接受。如果我在它周围发现'标记'或者在if上产生误报或漏报(例如:soodo这样的程序会在声明不存在的情况下声称存在,并且ssh会报告为未安装,即使它已经安装)

如果你们需要进一步澄清我正在做什么或类似的事情,请询问。这是我能提供的最少的回报,以换取他人的一些见解。

2 个答案:

答案 0 :(得分:1)

对于bash,type是确定命令是PATH中的程序,还是函数或别名的方法。

TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
for tool in "${TOOLS[@]}"; do
  if type -p "$tool" > /dev/null; then
    echo "$tool is installed"
  else
    echo "$tool is not installed"
  fi
done

您正在做的错误:

if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then

那里发生了什么:

  • 首先,echo ${TOOLS[@]} -222222将“ssh -222222”打印到stdout
  • 管道进入grep -q "not found",无法向stdout打印任何内容
  • 反引号将管道的输出(空白行,始终是grep -q的输出)替换为if命令,因此您获得if <a newline> ; then

您将得到与if $(printf "\n"); then echo Y; else echo N; fi完全相同的结果。

要做你正在尝试的事情,你必须写:

if "${TOOLS[0]}" -222222 2>&1 | grep -q "not found"; then ...

这将执行管道,然后if将考虑退出状态。退出状态为零被视为true,任何其他退出状态都被视为false。

但是,不要这样做以确定程序是否存在。

答案 1 :(得分:1)

#!/bin/bash
TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
#list of tools is abridged for convenience and added 'soodo' as a sure miss

for TOOL in ${TOOLS[@]}
do
  which $TOOL > /dev/null
  RESULT=$?
  if [ $RESULT -eq 0 ]
  then
    echo $TOOL is available
  else
    echo $TOOL is not available
  fi
done