如何将刚刚用 bash 编写的行退格并在其位置上放一个新行?我知道这是可能的,Aptitude (apt-get) 使用它来进行一些更新,看起来很棒。
试试这个:
$ printf "12345678\rABC\n"
ABC45678
如您所见,输出回车符会将光标移动到同一行的开头。
您可以像这样清除该行:
$ printf "12345678\r$(tput el)ABC\n"
ABC
使用
tput
为您提供了一种将控制字符发送到终端的便携方法。请参阅 man 5 terminfo
了解控制代码列表。通常,您需要将序列保存在变量中,这样您就不需要重复调用外部实用程序:
$ clear_eol=$(tput el)
$ printf "12345678\r${clear_eol}ABC\n"
ABC
我不太清楚你想要什么,但是,根据你的终端设置,你可以在屏幕上打印^H(控制H),这会将光标后退一个位置。
另请注意,某些终端能够将光标移动到行首,在这种情况下,您可以移动到行首,打印足够的空格来覆盖整行(通常可从 $COLUMNS 获得)并然后打印任何消息或其他内容。
如果您确切地说明了您想要什么并且我可以回答您,我会更新我的答案。
这是一个使用 find 命令和 while-read 循环仅在一行上不断打印到 stdout 的完整文件路径的示例:
command find -x / -type f -print0 2>/dev/null | while read -d $'\0' filename; do
let i+=1
filename="${filename//[[:cntrl:]]/}" # remove control characters such as \n, \r, ...
if [[ ${#filename} -lt 85 ]]; then
printf "\r\e[0K\e[1;32m%s\e[0m %s" "${i}" "${filename}"
else
printf "\r\e[0K\e[1;32m%s\e[0m %s" "${i}" "${filename:0:40}.....${filename: -40}"
fi
done; echo
最初的问题是关于动画进度条(在 apt-get 中),但似乎没有人真正回答这个最初的问题。
无论如何,我不久前根据这个StackOverflow Thread的最佳答案写了一些代码。有许多精美复杂的进度条,但没有一个是“倒计时”或“消失”的进度条。我也没有讨论该条在实际应用程序中可能代表的数据或位置。根据测量的内容,不存在适用于所有用例的单一解决方案。因此,我把这部分问题留给读者。
快速、Bash、无分叉
#!/usr/bin/bash
bar='###################################################################'
for (( i=${#bar}; i>0; i-- )); do
echo -ne "${bar:1:$i}-\r"
sleep .1s
done
0.3秒后
_$ #################################################################'
1.8秒后
_$ ##################################################
4.6秒后
_$ ###################
等等。
Bar 可以是任意字符或长度
bar1='#######'
或
bar2='++++++++++++'
Bash for 循环
for (( i=${#bar}; i>0; i-- ));做
Bash 参数扩展给出字符串变量的长度
i=${#bar}
Echo 带有抑制换行符标志并解释转义字符标志 -n -e
回声-ne
Bash 子字符串扩展变量 $i 扩展为字符串中的字符数:第一个 ${bar} 迭代,然后从那里开始倒数。这也可以做到 具有负偏移。
${参数:偏移:长度}
例如
${酒吧::$i}
Bar 可以替换为其他字符甚至空格;回车“退格”最右边的字符,然后是一个数字并替换一些其他字符或空格,例如连字符“-”
-
或
+
可配置定时; sleep 接受整数和浮点数作为输入,因此将其配置为每半秒或一秒的多个小数部分(例如 2.7 秒)运行一次
睡眠.1秒