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

我有以下在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 

但我希望这样做,“回声”在下一行显示下面的回声(不是与最后的回声输出连接,而是replace它),以使它看起来像它正在更新。 类似于百分比的进度条如何显示在同一行上。

那么我没有正确阅读这个man echo页面。

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

2个选项是-n-e

-n不会输出结尾的换行符。 所以每当我回应一些东西时,我就不用再换一个新的线了。

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

猜猜我想用什么逃生符号: \r 。 是的,回车会让我回到起点,它会看起来像我在同一行更新。

所以回声线看起来像这样:

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

我必须逃脱逃跑符号,所以Bash不会杀死它。 这就是为什么你在那里看到2个符号。

正如William提到的那样, printf也可以做类似的(甚至更广泛的)这样的任务。

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

 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 

其余的答案是相当不错的,但只是想添加一些额外的信息,以防有人来这里寻找解决scheme,以取代/更新多线回声。

所以我想和大家分享一个例子。 在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 ”的结果,并将更新结果replace以前的回声。

我不得不提的是,这个代码只是一个例子,但根据您的需要,可能不是最好的解决scheme。 几乎相同的命令(至less在视觉上)是“ watch -n 3 timedatectl ”。

但这是一个不同的故事。 🙂

希望有所帮助!