我目前正在编写一个 Bash 脚本。我想在打印文本的同时下载文件。例如,考虑这个脚本:
echo -e "---------------------------"
echo -e "Your file downloading..."
echo -e "---------------------------"
wget example.com/1gbfile
在第二个循环中,应每秒连续打印echo
each .
,直到下载完成。如果 的数量.
变为 3,如下所示:...
,则应将其重置为 1.
并继续循环。
答案1
主要脚本:
创建以下脚本作为进度/弹跳条的来源(我称之为bash-progress
):
#!/bin/bash
# Initial configuration variables
# Set time interval for progress delay (in fraction of seconds)
time_delay=".2"
# Set left and right brackets (1 character)
lb="["
# lb="("
# lb=" "
rb="]"
# rb=")"
# rb=" "
# Function to show bouncing bar while running command in the background
show_bouncer() {
# If no argument is given, then this is run on the last command - else provide PID
if [[ -z $1 ]]
then
PID=$!
else
PID=$1
fi
ii=0
# Define bouncer array (3 characters)
bo=('. ' '.. ' '...' ' ..' ' .' ' ..' '...' '.. ')
# bo=('⠄ ' '⠂⠄ ' '⠁⠂⠄' '⠂⠂⠂' '⠄⠂⠁' ' ⠄⠂' ' ⠄' ' ')
# bo=('⡇ ' '⣿ ' '⣿⡇ ' '⢸⣿ ' ' ⣿⡇' ' ⢸⡇' ' ⡇' ' ')
# True while the original command is running
while [[ -d "/proc/$PID" ]]
do
ch="${bo[(ii++)%${#bo[@]}]}"
printf "%b" " ${lb}${ch}${rb}"
sleep "$time_delay"
# Adjust backspaces to bouncer length + 3
printf "\b\b\b\b\b\b"
done
}
该脚本可以以两种方式工作:要么使用最后运行的命令的 PID,要么使用给定的 PID。最常见的用法是使用最后一个命令。
使用它:
因此,您只需像这样创建其他脚本:
#!/bin/bash
# Include Bash progress bars - or include the entire source in your script.
source "./bash-progress"
your_command_here &
show_bouncer
在后台运行该命令很重要,因为它会立即继续显示保镖。
您可以使用sleep
命令轻松地对其进行测试:
#!/bin/bash
# Include Bash progress bars - or include the entire source in your script.
source "./bash-progress"
sleep 5 &
show_bouncer
奖金信息:
要使用最后一个 PID 以外的其他 PID,您可以使用pgrep
(-n
表示最新和-x
精确匹配)来查找进程的最新实例,如下所示:
#!/bin/bash
# Include Bash progress bars - or include the entire source in your script.
source "./bash-progress"
your_command &
do_something_else
do_anything_meanwhile
show_bouncer $(pgrep -nx "your_command")