编程小白对屏幕上打印 提问

sh/bash/dash/ksh/zsh等Shell脚本
回复
william1204
帖子: 13
注册时间: 2019-07-22 2:06
系统: ubuntu 18.04

编程小白对屏幕上打印 提问

#1

帖子 william1204 » 2022-11-02 21:59

我在写一些小程序,使用printf打印检测某个传感器(譬如GPIO)的值,但我只能实现printf("\n")这样打印,我想着如何想在终端屏幕的固定位置显示我想打印的值,并且可变,类似与htop那种显示CPU的数字百分比。我应该学习哪方面的知识?
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 编程小白对屏幕上打印 提问

#2

帖子 lilydjwg » 2022-11-03 10:08

终端编程、ncurses 库、ANSI 转义序列、Python 的 urwid 库也挺好的。
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: 编程小白对屏幕上打印 提问

#3

帖子 astolia » 2022-11-03 11:31

单纯显示的话,纯shell也可以。用tput cols和tput lines获取终端大小(bash可以直接用COLUMNS和LINES),然后通过换行、空格等在指定位置输出文本

随手写了段在终端中央计数的脚本

代码: 全选

#!/bin/bash
PS1=""
N=0
tput civis
while true; do
  N=$((N + 1))
  tput clear
  #COLUMNS=$(tput cols)
  #LINES=$(tput lines)
  LINE=$(( LINES / 2 ))
  for (( i=0; i < LINE; i++ )); do
    echo
  done
  LEN=$(echo -n $N | wc -m)
  POS=$(( ( COLUMNS - LEN ) / 2 ))
  for (( j=0; j < POS; j++ )); do
    echo -n " "
  done
  echo $N
  sleep 0.1
done
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 编程小白对屏幕上打印 提问

#4

帖子 lilydjwg » 2022-11-03 11:48

你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: 编程小白对屏幕上打印 提问

#5

帖子 astolia » 2022-11-03 12:10

lilydjwg 写了: 2022-11-03 11:48 你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done
随手写啊,有去查转义序列的时间,循环早写完了
头像
lilydjwg
论坛版主
帖子: 4250
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 编程小白对屏幕上打印 提问

#6

帖子 lilydjwg » 2022-11-03 12:21

不要教坏新人啊。另外这种文档不放在手边么?
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

Re: 编程小白对屏幕上打印 提问

#7

帖子 astolia » 2022-11-03 12:24

lilydjwg 写了: 2022-11-03 12:21 不要教坏新人啊。另外这种文档不放在手边么?
这对我来说是平均一年都用不了一次的东西
头像
k9288k
帖子: 792
注册时间: 2012-02-21 22:27
系统: Ubuntu12.04

Re: 编程小白对屏幕上打印 提问

#8

帖子 k9288k » 2023-05-11 16:26

lilydjwg 写了: 2022-11-03 11:48 你这每次 reset 然后用换行和空格抵达目标位置也太……想起 MS Word 缩进、右对齐用空格的人。
不如这样:

代码: 全选

#!/bin/bash -e

tput smcup civis
trap 'tput rmcup cnorm; exit' TERM INT

i=0
while true; do
  printf "\e[%d;%df%4d\e[K" $(( LINES / 2 )) $(( COLUMNS / 2 - 2 )) $(( i++ ))
  sleep 0.1
done
感谢依云仙子。经测试特别好用
回复