bash脚本完全覆盖当前行

时间:2015-04-24 17:01:18

标签: bash

我一直在玩一个脚本来通过ping来测试各种VoIP服务器的速度,然后我找到了一个进度条脚本并合并了......因为很酷! 现在我正在尝试在状态栏下面显示正在测试的当前服务器,我有行覆盖,但如果下一个服务器名称更短,则不会完全覆盖。我已经尝试了各种建议,但我没有找到工作,或者他们搞砸了我的进度条。

我正在运行osx但也可能在各种Linux发行版上使用它。

任何建议都会很棒!

{{1}}

3 个答案:

答案 0 :(得分:1)

以下是在显示仪表期间以及在完成后恢复光标时控制清除到行尾的示例。我已经颠倒了循环,以显示仪表从100%(完整)进展到1%后自行清理:

#!/bin/bash

## string of characters for meter (60 - good for 120 char width)
str='▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒'

tput civis                  # make cursor invisible

for i in `seq 100 -1 1`; do    # for 1 to 100, save cursor, restore, output, restore
    printf "\033[s\033[u Progress: %s %3d %% \033[u" "${str:0:$(((i+1)/2))}" "$i"
    sleep 0.1               # small delay
done

sleep 0.5

printf "\033[K"             # clear to end-of-line

tput cnorm                  # restore cursor to normal

exit 0

注意:在显示仪表期间光标控制和清除由save cursor positionrestore cursor position的ANSI转义提供。完成后,clear to end of line用于清理。 tput用于控制游标可见性,但也可用于保存,恢复和清除到行尾。

答案 1 :(得分:0)

您可以填充空格,以便始终写入相同数量的字符。这样你就可以用空格覆盖之前的额外字符。例如,你可以像

echo -en "\r"; echo -n $(printf "            TESTING: %-40s" $seru)

答案 2 :(得分:0)

感谢David C. Rankin,我有一个轻松的工作答案

    echo -ne "" '\r' "              TESTING:"   $seru '\033[K'