使用echo更新终端中的多行

问题描述 投票:0回答:2

我有一个为我的项目做的任务,我有点误解了这个主题。

目的

  • 在终端上打印几行。
  • 实时更新价值。

作为测试,我尝试了从命令ps模拟的十行,持续30秒。 `

#!/bin/bash
test=$(ps -ao pid,pcpu,time,comm | head -n10)

for time in $(seq 1 30); do
    echo -ne "$test\r"
    sleep 1
    test=$(ps -ao pid,pcpu,time,comm | head -n10)
done
  • 我知道我的代码不干净,我正在努力学习所以我访问了console_codes的手册页,我得到你必须使用类似echo -e " text area \033\r"之类的东西来获得正确的光标位置以便更新这条线和我很适合一条线,但十条线我完全丢了。
  • 我在一个echo上使用了一个变量刷新,但我得知我错了。
  • 如果可能的话,我想要一个我的例子的解决方案以及我如何处理多行的解释,因为我的例子在新行上打印而不更新/删除旧行。

注意:这个例子不是我的任务,但它代表了我现在面临的挑战

谢谢你的时间。

bash shell echo
2个回答
1
投票

最简单,最便携和稳定的解决方案是在每次迭代时清除屏幕:

#!/bin/bash

for i in {1..30} ; do
    clear

    # Print several lines
    printf "foo %d\n" "${i}"
    printf "bar %d\n" "${i}"

    sleep 1
done

或者,您可以使用以下序列:

# Save the cursor position
printf "\033[s"
# Print two empty dummy lines
printf "\n\n"

for i in {1..30} ; do
    # Delete the last two lines
    printf "\033[2K"
    # Restore the cursor position
    printf "\033[u"

    # Print two lines
    printf "foo ${i}\n"
    printf "bar ${i}\n"

    sleep 1
done

请注意,上述^^^解决方案仅在您事先知道要打印/清除的行数时才有效。


0
投票

你可以使用echo -e "\e[nA"去n行(n应该是一个整数)。如果所有行都具有相同的长度,则可以执行以下操作。

lines=10
for i in {0..30}; do
    ps -ao pid,pcpu,time,comm | head -n${lines}  # print `$lines` lines
    sleep 1
    echo -e "\e[$((${lines}+1))A"                # go `$lines + 1` up
done
© www.soinside.com 2019 - 2024. All rights reserved.