Linux系统tput命令用法实例详解

tput简介:

用户可以使用shell的tput命令创建交互性的、专业性强的屏幕输出,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。
系统上需要一个彩色监视器和tput命令。tput使用文件/etc/terminfo或/etc/termcap,这样就可以在脚本中使用终端支持的大部分命令了。
在使用tput前需要使用tput命令初始化终端:
$ tput init
tput产生三种不同的输出:字符型、数字型和布尔型(真/假)。

常用参数:
(1)字符串输出参数设置 
  bel      警铃 
  blink    闪烁模式 
  bold     粗体 
  civis    隐藏光标 
  clear    清屏 
  cnorm    不隐藏光标 
  cup      移动光标到屏幕位置(x,y) 
  el       清除到行尾 
  ell      清除到行首 
  smso     启动突出模式 
  rmso     停止突出模式 
  smul     开始下划线模式 
  rmul     结束下划线模式 
  sc       保存当前光标位置 
  rc       恢复光标到最后保存位置 
  sgr0     正常屏幕 
  rev      逆转视图 
(2)数字输出参数设置 
  cols     列数目 
  ittab    设置宽度 
  lines    屏幕行数 
(3)布尔输出参数设置 
  chts     光标不可见 
  hs       具有状态行

另外还有:

     tput setb no :设置终端背景色。 no的取值稍后介绍
     tput setf no : 设置文本的颜色。no的取值稍后介绍
     tput ed :删除当前光标到行尾的内容
     no的取值:0:黑色、1:蓝色、2:绿色、3:青色、4:红色、5:洋红色、6:黄色、7:白色

光标属性
在UNIX shell脚本中或在命令行中,移动光标或更改光标属性可能是非常有用的。有些情况下,您可能需要输入敏感信息(如密码),或在屏幕上两个不同的区域输入信息。在此类情况下,使用tput可能会对您有所帮助。

1、移动光标
使用tput可以方便地实现在各设备上移动光标的位置。通过在tput中使用cup选项,或光标位置,您可以在设备的各行和各列中将光标移动到任意X或Y坐标。设备左上角的坐标为(0,0)。 
要在设备上将光标移动到第5列(X)的第1行(Y),只需执行tput cup 5 1。另一个示例是tput cup 23 45,此命令将使光标移动到第23列上的第45行。

2、移动光标并显示信息
另一种有用的光标定位技巧是移动光标,执行用于显示信息的命令,然后返回到前一光标位置:(tput sc ; tput cup 23 45 ; echo“Input from tput/echo at 23/45”; tput rc)
下面我们分析一下subshell命令:tput sc 
必须首先保存当前的光标位置。要保存当前的光标位置,请包括sc选项或“save cursor position”。tput cup 23 45 
在保存了光标位置后,光标坐标将移动到(23,45)。echo“Input from tput/echo at 23/45”

3、将信息显示到stdout中。tput rc 
在显示了这些信息之后,光标必须返回到使用tput sc保存的原始位置。要使光标返回到其上次保存的位置,请包括rc选项或“restore cursor position”。 
注意:由于本文首先详细介绍了通过命令行执行tput,因此您可能会觉得在自己的subshell中执行命令要比单独执行每条命令然后在每条命令执行之前显示提示更简洁。

4、更改光标的属性(可见,不可见) 
在向某一设备显示数据时,很多时候您并不希望看到光标。将光标转换为不可见可以使数据滚动时的屏幕看起来更整洁。要使光标不可见,请使用civis选项(例如,tput civis)。在数据完全显示之后,您可以使用cnorm选项将光标再次转变为可见。

5、文本属性(文本颜色…) 
更改文本的显示方式可以让用户注意到菜单中的一组词或警惕用户注意某些重要的内容。您可以通过以下方式更改文本属性:使文本加粗、在文本下方添加下划线、更改背景颜色和前景颜色,以及逆转颜色方案等。

要更改文本的颜色,请使用setb选项(用于设置背景颜色)和setf选项(用于设置前景颜色)以及在terminfo数据库中分配的颜色数值。通常情况下,分配的数值与颜色的对应关系如下,但是可能会因UNIX系统的不同而异:
0:黑色
1:蓝色
2:绿色
3:青色
4:红色
5:洋红色
6:黄色
7:白色 
执行以下示例命令可以将背景颜色更改为黄色,将前景颜色更改为红色:tput setb 6
tput setf 4
要反显当前的颜色方案,只需执行tput rev。 
有时,仅为文本着色还不够,也就是说,您想要通过另一种方式引起用户的注意。可以通过两种方式达到这一目的:一是将文本设置为粗体,二是为文本添加下划线。 
要将文本更改为粗体,请使用bold选项。要开始添加下划线,请使用smul选项。在完成显示带下划线的文本后,请使用rmul选项。(rmul,结束下划线模式)

将shell脚本提升到下一级别

现在您已经了解了从命令行中执行tput的基本知识,下面我们将重点讲述如何将您学到的知识连同其他一些功能用到shell脚本中。首先,tput提供了以下一些附加功能:提取终端信息(如设备,列数和行数)和清除屏幕上的数据。

要确定当前的列数(即,您在目标设备上可以使用的宽度),请使用cols选项。要查找行数(即行当前的高度),请使用lines选项。 您可以使用几种方法清除数据,具体取决于需要的结果。要清除从当前光标位置到行尾的数据,可以使用tput el。要清除从当前光标位置到设备末尾的数据,可以使用tput ed。如果您想要清除整个设备,请使用tput clear。

将其全部放到一个脚本中,创建了一个基本菜单。
如何在tput中使用本文中介绍的多个选项增强您的代码。

下面的代码创建了一个基本菜单。此脚本介绍了如何在 tput 中使用本文中介绍的多个选项增强您的代码。
 #!/bin/bash
trap `get_window_size` WINCH                    # trap when a user has resized the window

_UNDERLINE_ON=`tput smul`                       # turn on underline
_UNDERLINE_OFF=`tput rmul`                     # turn off underline

get_window_size() {
  _WINDOW_X=`tput lines`
  _WINDOW_Y=`tput cols`

  _FULL_SPACES=`echo ""|awk `
  {
    _SPACES = `${_WINDOW_Y}`
    while (_SPACES-- > 0) printf (" ")
  }'`
  _FULL_UNDERLINE=`echo "${_UNDERLINE_ON}${_FULL_SPACES}${_UNDERLINE_OFF}"`

  unset _FULL_SPACES
  show_menu

  return 0
}


set_color() {
  tput clear
  PS3="Enter Selection[1-9]:"
  select _COLOR in "Black" "Blue" "Green" "Cyan" "Red" "Magenta" "Yellow" "White" "Exit"
  do
    case ${REPLY} in
       [1-8])  _X=`expr ${REPLY} - 1`;;
           9)  break;;
           *)  echo "Invalid Color"; continue;;
    esac


    if [[ ${1} = "b" ]]
    then
      tput setb ${_X}
    else
      tput setf ${_X}
    fi
  done
}

show_menu() {
  while [[ -z ${_ANS} ]]
  do
    tput civis
    tput clear

        cat <<- EOF
                Window Size: ${_WINDOW_X} / ${_WINDOW_Y}
                Select => ${_UNDERLINE_ON}     ${_UNDERLINE_OFF}
                ${_FULL_UNDERLINE}
                B) Background Text Color
                F) Foreground Text Color
                X) Exit
        EOF

    tput rc
    tput smul
    tput cnorm

    read _ANS
    tput rmul

    case ${_ANS} in
      [Bb])  set_color "b";;
      [Ff])  set_color "f";;
      [Xx])  tput clear; exit;;
         *)
             echo -e "Invalid Selection: ${_ANS}\c"
             sleep 2
             ;;
    esac
    unset _ANS
  done
}

tput sgr0
tput civis
tput clear
tput cup 3 10
tput sc
tput cup 0 0

[[ -n ${_ANS} ]] && unset _ANS
get_window_size

exit 0
下面我们分析一下 shell 脚本。
设置解释脚本的方式。在本例中,要使用的 shell 为 Bash。为 WINCH 信号设置一个陷阱,同时指定 get_window_size 函数作为捕获到的信号的触发器。在设置了陷阱之后,定义两个变量以便稍后在脚本中键入时使用。
#!/bin/bash
trap `get_window_size` WINCH                    # trap when a user has resized the window
_UNDERLINE_ON=`tput smul`                       # turn on underline
_UNDERLINE_OFF=`tput rmul`                      # turn off underline
创建一个名为 get_widow_size 的函数用来确定行数和列数。此外,定义 _FULL_UNDERLINE 变量,设备的宽度(带有下划线)。
get_window_size() {
  _WINDOW_X=`tput lines`
  _WINDOW_Y=`tput cols`

  _FULL_SPACES=`echo ""|awk `
  {
    _SPACES =`${_WINDOW_Y}`
    while (_SPACES-- > 0) printf (" ")
  }'`
  _FULL_UNDERLINE=`echo "${_UNDERLINE_ON}${_FULL_SPACES}${_UNDERLINE_OFF}"`

  unset _FULL_SPACES
  show_menu
  return 0
}
创建一个名为 set_color 的函数来允许用户测试背景和前景文本颜色。
set_color() {
  tput clear
  PS3="Enter Selection[1-9]:"
  select _COLOR in "Black" "Blue" "Green" "Cyan" "Red" "Magenta" "Yellow" "White" "Exit"
  do
    case ${REPLY} in
       [1-8])  _X=`expr ${REPLY} - 1`;;
           9)  break;;
           *)  echo "Invalid Color"; continue;;
    esac

    if [[ ${1} = "b" ]]
    then
      tput setb ${_X}
    else
      tput setf ${_X}
    fi
  done
}
创建一个名为 show_menu 的函数,通过此函数来演示设备的大小。此函数中演示的内容还包括:将光标转变为不可见,清除屏幕,打印文本,以及返回到保存的光标位置。
show_menu() {
  while [[ -z ${_ANS} ]]
  do
    tput civis
    tput clear

        cat <<- EOF
                Window Size: ${_WINDOW_X} / ${_WINDOW_Y}
                Select => ${_UNDERLINE_ON}     ${_UNDERLINE_OFF}
                ${_FULL_UNDERLINE}
                B) Background Text Color
                F) Foreground Text Color
                X) Exit
        EOF

    tput rc
    tput smul
    tput cnorm

    read _ANS
    tput rmul

    case ${_ANS} in
      [Bb])  set_color "b";;
      [Ff])  set_color "f";;
      [Xx])  tput clear; exit;;
         *)
             echo -e "Invalid Selection: ${_ANS}\c"
             sleep 2
             ;;
    esac
    unset _ANS
  done
}
接下来,设置一些基本的光标属性。首先,可以使用 sgr0 清除所有属性。光标将转换为不可见,并且屏幕将被清除。不可见的光标现在移动到 (3,10),此位置将被保存,然后光标将移动到 (0,0)(左上角)。
tput sgr0
tput civis
tput clear
tput cup 3 10
tput sc
tput cup 0 0
最后,调用 get_window_size 函数获取窗口大小,进而调用 function show 菜单。
[[ -n ${_ANS} ]] && unset _ANS
get_window_size

exit 0


将tput引入UNIX中的shell脚本可以改善脚本的外观。在UNIX中可以通过数百种方法来完成一项任务,为何不为您的方法增加一些色彩和个性化因素呢?
学习tput非常容易,并且可能对脚本是非常有效的;用户将从更多地控制屏幕的外观方面获益。

通过tput和极少的工作量,可以创建全面的菜单驱动的shell脚本。


阅读更多
版权声明:【博主微信公众号:不忘初心的行者】【本文为博主原创,未经博主允许不得转载】 https://blog.csdn.net/u010193457/article/details/52589923
文章标签: shell linux 脚本 tput
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭