【发布时间】:2011-10-08 18:04:13
【问题描述】:
已经回答了这个问题的一些密切候选者,我已经尝试了几种方法来尝试解决这个问题。具体来说,我的场景是这样的:
我有一组实用程序名称,它们可能会或可能不会安装在 linux 机器上(例如:ssh、sudo 等),所以我试图根据尝试的结果检查实用程序是否存在依次调用实用程序。我正在尝试在 bash 中执行此操作。 Bash 版本是 4.1.5(1),在 Ubuntu 10.10 上运行,但计划部署在 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 似乎从未被准确地拾取。如果我在它周围加上 ` 标记,要么在 if 上产生误报或误报(例如:像 soodo 这样的程序在不存在时会被声称存在,而像 ssh 这样的程序会被报告为未安装,即使它是) .
如果你们需要进一步说明我正在尝试做什么或类似的事情,请询问。这是我能提供的最少的回报,以换取其他人的一些见解。
【问题讨论】:
-
您应该使用
which而不是调用无效命令。解析错误消息是一个坏习惯,因为它旨在帮助用户使用其自然语言。例如,在法语系统上,您永远不会看到“未找到”字符串。 -
不要那么肯定“-222222”是一个荒谬的选择。对于许多选项解析器,“-abcd”与“-a -b -c d”相同,因此“-222222”为“-2 -2 -2 -2 -2 -2”。 ssh 确实有一个有效的选项“-2”
标签: bash packages substring busybox