tput命令用法实例详解

发布时间:2020-08-23编辑:脚本学堂
有关linux shell编程中tput命令的用法,tpu命令实例教程,通过使用tput,可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。

tput命令将通过terminfo数据库对您的终端会话进行初始化和操作。

通过使用tput,可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。

什么是terminfo数据库?
UNIX系统上的terminfo数据库用于定义终端和打印机的属性及功能,包括各设备(例如,终端和打印机)的行数和列数以及要发送至该设备的文本的属性。UNIX中的几个常用程序都依赖
terminfo数据库提供这些属性以及许多其他内容,其中包括vi和emacs编辑器以及curses和man程序。

tput命令行简介

与UNIX中的大多数命令一样,tput命令既可以用在shell命令行中也可以用在shell脚本中。为让您更好地理解tput,首先从命令行讲起,然后紧接着讲述shell脚本示例。
tput命令将通过terminfo数据库对您的终端会话进行初始化和操作。
通过使用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       具有状态行
光标属性
在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中使用本文中介绍的多个选项增强您的代码。
 

复制代码 代码示例:
#!/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 ""|linuxjishu/13830.html target=_blank class=infotextkey>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脚本。