如何在同一行显示和更新回声

我在 Bash (Linux)中有以下内容

for dir in Movies/*
do
(cd "$dir" && pwd|cut -d \/ -f5|tr -s '\n' ', ' >> ../../movielist &&
exiftool * -t -s3 -ImageSize -FileType|tr -s '\t' ',' >> ../../movielist )
echo "Movie $movies - $dir ADDED!"
let movies=movies+1
done

但是我希望让“ echo”在下一行显示下面的 echo (不是连接到最后的 echo 输出,而是替换它) ,以使它看起来像是正在更新。类似于百分比进度条在同一行上的显示方式。

282241 次浏览

嗯,我没有正确阅读 man echo页为此。

如果我添加第三个转义字符,echo有两个选项可以做到这一点。

这两个选项是 -n-e

-n不会输出尾随换行符。这样我就不用每次重复一句话就换新台词了。

-e允许我解释反斜杠转义符号。

猜猜我想用什么转义符号: \r。是的,回车将送我回到开始,它将视觉上看起来像我更新在同一行。

所以回声线应该是这样的:

echo -ne "Movie $movies - $dir ADDED!"\\r

我必须逃离逃跑符号,这样 Bash 才不会杀了它。这就是为什么你在上面看到2个 \符号。

正如 William 所提到的,printf也可以执行类似(甚至更广泛)的任务。

如果我理解得很好,你可以用下面这行代替你的回声:

echo -ne "Movie $movies - $dir ADDED! \033[0K\r"

下面是一个小例子,你可以通过运行来理解它的行为:

#!/bin/bash
for pc in $(seq 1 100); do
echo -ne "$pc%\033[0K\r"
sleep 1
done
echo

其余的答案都很不错,但只是想添加一些额外的信息,以防有人来这里寻找替换/更新多行回显的解决方案。

所以我想和大家分享一个例子。下面的脚本在 CentOS 系统上进行了尝试,并使用了“ timedatectl”命令,该命令基本上打印了系统的一些详细时间信息。

我决定使用这个命令,因为它的输出包含多行代码,对于下面的示例来说非常适用:

#!/bin/bash
while true; do
COMMAND=$(timedatectl) #Save command result in a var.
echo "$COMMAND" #Print command result, including new lines.


sleep 3 #Keep above's output on screen during 3 seconds before clearing it


#Following code clears previously printed lines
LINES=$(echo "$COMMAND" | wc -l) #Calculate number of lines for the output previously printed
for (( i=1; i <= $(($LINES)); i++ ));do #For each line printed as a result of "timedatectl"
tput cuu1 #Move cursor up by one line
tput el #Clear the line
done


done

以上将永久打印“ timedatectl”的结果,并用更新的结果替换以前的回声。

我必须提到,这段代码只是一个例子,但可能并不是您所需要的最佳解决方案。 类似的命令“ watch -n 3 timedatectl”也可以完成几乎相同的操作(至少在视觉上是这样的)。

但那是另一回事了。 :)

希望能帮上忙!

我最喜欢的方法叫做睡到50岁。这里需要在 echo 语句中使用 i变量。

for i in $(seq 1 50); do
echo -ne "$i%\033[0K\r"
sleep 50
done
echo "ended"

这是非常有用的,请尝试并根据需要更改:

#!/bin/bash
for load in $(seq 1 100); do
echo -ne "$load % downloded ...\r"
sleep 1
done
echo "100"
echo "Loaded ..."

你可以试试这个. . 我自己的版本. 。

funcc() {
while true ; do
for i in \| \/ \- \\ \| \/ \- \\; do
echo -n -e "\r$1  $i  "
sleep 0.5
done
#echo -e "\r                                                                                      "
[ -f /tmp/print-stat ] && break 2
done
}


funcc "Checking Kubectl" & &>/dev/null
sleep 5
touch /tmp/print-stat
echo -e "\rPrint Success                  "

我使用 printf,它更短,因为它不需要标志来完成工作:

printf "\rMy static $myvars composed text"