Câu trả lời:
Tôi không thể thấy một cách để làm điều này bằng cách sử dụng bar
. Tuy nhiên, bạn có thể quan tâm đến các lệnh khác làm điều tương tự, có thể đáp ứng nhu cầu của bạn tốt hơn.
Phương pháp này sẽ đơn giản ghi đè lên những gì đã được hiển thị trước đó trên màn hình với thanh tiến trình lớn hơn. Đơn giản mà hiệu quả.
Ví dụ ex.bash
:
#!/bin/bash
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
Lệnh pv
cung cấp chức năng thanh tiến trình. Bạn có thể xem các ví dụ chi tiết hơn trong bài viết này có tiêu đề: Một tiện ích Unix bạn nên biết về: Trình xem ống .
$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
Bạn có thể sử dụng mã mẫu sau để tạo "spinner" của riêng mình bằng cách sử dụng một vòng lặp đơn giản. Trong vòng lặp, bạn có thể nhúng bất kỳ lệnh nào bạn muốn. Mã này xuất phát từ bài viết này, có tiêu đề: Tôi có thể làm một spinner trong Bash không? .
#!/bin/bash
sp='/-\|'
printf ' '
for i in $(seq 3); do
printf '\b%.1s' "$sp"
sp=${sp#?}${sp%???}
sleep 1
done
echo ''
Có một lệnh được gọi là dialog
thực hiện khá nhiều những gì bạn muốn. Nó sử dụng các hộp thoại đồ họa, nhưng chúng dựa trên các nút để chúng hoạt động trong hầu hết mọi thiết bị đầu cuối và / hoặc tập lệnh miễn là có hỗ trợ cho các mật mã. Bạn có thể xem tất cả các dialog
tài liệu trên trang web của dự án .
ảnh chụp màn hình
Nó có vẻ tầm thường để thực hiện. Hàm bash bên dưới (thanh) bên dưới hoạt động giống như bar
tập lệnh của bạn (dựa trên đoạn ghi hình ngắn). Nó cũng thay đổi kích thước linh hoạt với chiều rộng của thiết bị đầu cuối (trong cuộc gọi tiếp theo bar
).
#!/bin/bash
#Helper functions
terminal_width(){
local width_height=`stty size`
echo ${width_height/* /}
}
string_times_n(){
local s=$1
local n=$2
for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
local percentage=$1
local padding=10
local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
local dots_n=$((width - equals_n))
#ANSI escape sequence magic
local Esc="\033["
local up="$Esc""K""$Esc""1A""$Esc""K"
#Clear the line
string_times_n ' ' "$width"
echo -ne "\r"
#Print the current screen
printf "%3s%% [" "$percentage"
string_times_n '=' "$equals_n"
string_times_n '.' "$dots_n"
echo -n "]"
#Go up unless finished
if [[ "$percentage" == 100 ]]
then
echo
else
echo -e "$up"
fi
}
. bar.sh #Assuming it's saved in bar.sh
bar $percentage
for i in {1..10}; do bar $((i*10)); sleep 0.1; done;
for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;