我正在写一个bash脚本来执行安装。
我不希望用户看到命令及其输出,所以我将使用2>&1重定向它们。
我确实希望为完成安装的每个部分打印进度条,并根据是否有错误打印成功/失败消息,例如:

Installing OpenCv ..................... [Success]
Installing Qt     ..................... [Failed]

这是我的代码:
#!/bin/bash

installOf="Installing OpenCv  "

function printProgressBar()
{
    local progressBar="."
    printf "%s" "${progressBar}"
}

function InstEssent
{
    sudo apt-get -y install build-essential
    sleep 5
    echo "Done"
}

printf "%s" "${installOf}"

InstEssent  &

while [ "${InstEssent}" != "Done" ]
do
    printProgressBar
    sleep 1
done

installStatus="Success"
printf " [%s]\n" "${installStatus}"

最佳答案

好吧,因此在bash或我知道的其他shell中没有本机工具,但是您可以使用下面的printf这个自定义函数来实现您需要的功能。这个小片段将打印安装进度条,您只需在脚本中要显示它的不同位置通过普通函数调用printProgressBar即可打印安装进度条。

function printProgressBar() {
    local progressBar="."
    printf "%s" "${progressBar}"
}

假设在函数调用中有n个步骤,请在中间插入此函数调用。对于错误消息的实际打印,请在变量installOf中填写安装头,该变量假设您的示例中可以采用"Installing OpenCv "(或)"Installing Qt ",在执行以下步骤之前在此变量中使用它
installOf="Installing OpenCv  "
printf "%s" "${installOf}"

对于最终状态,由于您没有让我们知道如何获得安装的总体状态,假设您根据成功或失败找到它,请在另一个变量中更新它
installStatus="Success"
printf " [%s]\n" "${installStatus}"

综上所述,我有一个简单的while循环,它运行函数20次调用,您可以使用类似的方法在脚本的不同位置采用函数调用。
installOf="Installing OpenCv  "

function printProgressBar() {
    local progressBar="."
    printf "%s" "${progressBar}"
}

printf "%s" "${installOf}"

while (( cnt < 20))
do
    ((cnt++))
    printProgressBar
    sleep 1
done

# You can determine the status of your installation as your script demands

installStatus="Success"
printf " [%s]\n" "${installStatus}"

运行脚本会产生与您的需求类似的结果,
$ bash script.sh
Installing OpenCv  .................... [Success]

注意,每个.表示函数调用的每个实例。
更新:
看看你的代码逻辑,你忽略了一点关于后台作业是如何工作的。安装某个模块时的后台功能。要有效地使用进度条,您需要不断地轮询后台作业,以查看它是否仍在使用InstEssent命令运行,如果它正在运行,请按下面的代码所示打印安装条。
function InstEssent()
{
    sudo apt-get -y install build-essential
    sleep 5
}

printf "%s" "${installOf}"

InstEssent  &
pid_InstEssent="$!"

while kill -0 "$pid" 2> /dev/null
do
    printProgressBar
    sleep 1
done

10-02 05:02
查看更多