Я использовал ответ от Создание строки повторяющихся символов в скрипте оболочки для повторения символов. У меня есть две относительно небольшие версии bash для сценариев, которые должны отображать индикатор выполнения (например, цикл, который проходит через много файлов, но не полезен для больших файлов tar или операций копирования). Более быстрая состоит из двух функций, одна из которых предназначена для подготовки строк для отображения строки:
preparebar() {
# $1 - bar length
# $2 - bar char
barlen=$1
barspaces=$(printf "%*s" "$1")
barchars=$(printf "%*s" "$1" | tr ' ' "$2")
}
и один для отображения индикатора выполнения:
progressbar() {
# $1 - number (-1 for clearing the bar)
# $2 - max number
if [ $1 -eq -1 ]; then
printf "\r $barspaces\r"
else
barch=$(($1*barlen/$2))
barsp=$((barlen-barch))
printf "\r[%.${barch}s%.${barsp}s]\r" "$barchars" "$barspaces"
fi
}
Может использоваться как:
preparebar 50 "#"
, что означает подготовку строк для бара с 50 символами "#", и после этого:
progressbar 35 80
отобразит количество символов "#", которое соответствует соотношению 35/80:
[##################### ]
Имейте в виду, что функция отображает строку в одной и той же строке снова и снова, пока вы (или какая-либо другая программа) не напечатаете новую строку. Если вы установите -1 в качестве первого параметра, полоса будет стерта:
progressbar -1 80
Более медленная версия все в одной функции:
progressbar() {
# $1 - number
# $2 - max number
# $3 - number of '#' characters
if [ $1 -eq -1 ]; then
printf "\r %*s\r" "$3"
else
i=$(($1*$3/$2))
j=$(($3-i))
printf "\r[%*s" "$i" | tr ' ' '#'
printf "%*s]\r" "$j"
fi
}
и его можно использовать как (тот же пример, что и выше):
progressbar 35 80 50
Если вам нужен прогрессбар на stderr, просто добавьте >&2
в конце каждой команды printf.