如何使用 bash 脚本检查是否安装了两个或多个程序?

pot*_*day 6 command-line bash scripts

我想使用 bash 脚本检查是否安装了两个或多个程序:

hash foo &> /dev/null
if [ $? -eq 1 ]; then
    echo >&2 "foo not found."
else
    echo "foo found"
fi
Run Code Online (Sandbox Code Playgroud)

上面的脚本适用于单个程序,我想检查系统中安装的多个程序。我怎样才能做到这一点?

ter*_*don 8

如果要检查所有这些都已安装,只需执行以下操作:

hash foo bar baz &>/dev/null && 
    echo "All programs installed" ||
    echo "At least one program is missing"
Run Code Online (Sandbox Code Playgroud)

&>重定向标准错误和标准输出/dev/null,所以你不打印的输出hash2>据我所知,您可能只需要hash打印到标准错误,但我们最好还是安全一点。

&&意味着只有在前一个命令成功时才会运行下一个命令。这||意味着只有在前一个命令失败时才会运行下一个命令。因此,如果您检查的三个(或 N 个)程序之一未安装,您将收到错误消息。

如果您想被告知未安装哪个程序,请改用以下程序:

for p in foo bar baz; do 
    hash "$p" &>/dev/null && echo "$p is installed" ||
                 echo "$p is not installed"
done 
Run Code Online (Sandbox Code Playgroud)

最后,对于更细粒度的控制和详细的输出,您可以执行以下操作:

i=0; n=0; progs=(foo bar baz);
for p in "${progs[@]}"; do
    if hash "$p" &>/dev/null
    then
        echo "$p is installed"
        let c++
    else
        echo "$p is not installed"
        let n++
    fi
done
printf "%d of %d programs were installed.\n"  "$i" "${#progs[@]}" 
printf "%d of %d programs were missing\n" "$n" "${#progs[@]}"
Run Code Online (Sandbox Code Playgroud)