检查bash中是不是存在程序

Posted

技术标签:

【中文标题】检查bash中是不是存在程序【英文标题】:Check if a program exists in bash检查bash中是否存在程序 【发布时间】:2011-02-06 05:05:17 【问题描述】:

我正在尝试检查 Solaris 上是否存在 md5sum 或摘要,并且脚本是否在不同的机器上使用。

这是从 ksh 脚本调用的 sh 脚本中的函数

getMD5cmd ()

    PATH="$PATH:/bin:/usr/bin:/usr/sfw/bin:/usr/local/bin:/usr/sbin/bin"
    if type -p md5sum;then
        MD5CMD=`type -p md5sum`
    elif type -p digest;then
        MD5CMD="`type -p digest` -a md5"
    fi
    echo "HERE $MD5CMD"

当我运行脚本时,我得到了

-p not found
md5sum not found
-p not found
digest is /bin/digest
HERE

但是,当我在终端中输入它时,会按预期工作

有什么想法吗? 谢谢

【问题讨论】:

【参考方案1】:

在设置 PATH 时,似乎没有必要知道命令的确切位置。

getMD5cmd ()

    PATH=$PATH:/bin:/usr/bin:/usr/sfw/bin:/usr/local/bin:/usr/sbin/bin
    md5sum /dev/null >/dev/null 2>&1 && MD5CMD=md5sum || MD5CMD="digest -a md5"
    echo "HERE $MD5CMD"

getMD5cmd

【讨论】:

我对确切的路径不感兴趣。该脚本位于用户 home/bin 上,根据用户登录的机器,我不知道系统上存在哪些命令。【参考方案2】:

您可能正在为您的交互式 shell 运行 ksh 或 Bash。这两个都有-p 选项type。运行脚本的 shell(可能是 sh)具有 type,但没有 -p 选项,因此它正在寻找“-p”作为可执行文件的名称,但没有找到它。

因此您可以将脚本更改为使用ksh,或者您可以使用which 程序。后者可能更便携,因为有些系统没有ksh

【讨论】:

我不敢相信我能变得多么天真,甚至从来没有想过。感谢您对此有所了解。我现在将脚本转换为 bash 并且我的代码有效 哦,好吧,我将脚本转换为 bash 并最终使用了您的建议【参考方案3】:
if which md5sum >/dev/null 2>&1; then
    md5cmd="md5sum"
elif  which digest >/dev/null 2>&1; then
    md5cmd="digest -a md5"
else
    echo "No md5 command found" >&2
    exit 1
fi

$md5cmd YOUR_FILE

【讨论】:

第一个条件评估为真,即使机器上没有 md5sum 也是如此 我认为原因是“哪个”在 Solaris 上总是有输出,当找不到命令时,响应是“在 /usr/bin /vol2/bin 中没有 md5sum”【参考方案4】:

您是否尝试过以下语法:

MD5CMD="$(type -p md5sum digest |sed -e 's/digest$/digest -a md5/' |head -1)"
if [ -z "$MD5CMD" ]; then
    echo 'no md5 sum command found' >&2
    exit 1
fi
echo "HERE $MD5CMD"

我在 Cygwin 中试过这个,type 会返回多行,所以它可以工作。

【讨论】:

以上是关于检查bash中是不是存在程序的主要内容,如果未能解决你的问题,请参考以下文章

检查Bash数组中是不是存在元素[重复]

Bash,...检查是不是安装了程序,使用 bash 脚本 [重复]

检查bash脚本中是不是存在mysql用户,出现错误

检查 Bash shell 脚本中是不是存在输入参数

如何检查程序是不是在 Windows 上的 Ubuntu 上的 Bash 中运行,而不仅仅是普通的 Ubuntu?

使用if else bash脚本检查变量是不是存在[重复]