在脚本中添加颜色
Posted burnovblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在脚本中添加颜色相关的知识,希望对你有一定的参考价值。
shell脚本一直单调,但是在图形环境下运行,除了read和echo语句外,还有其他许多与脚本用户交互的方法。这一节深入介绍几种不同的方法。
1、创建文本菜单
创建交互式的shell文本,主要使用case语句
1.1、创建菜单布局
确定所要显示的内容: echo -e #-e指定了输出内容中必须要包含制表符和换行符。
例如:echo -e "1.\\tDisplay disk space"
设置菜单:
clear echo echo -e "\\t\\t\\tSys Admin Menu\\n" echo -e "\\t1.Display disk space" echo -e "\\t2.Display logged on users" echo -e "\\t3.Display memory usage" echo -e "\\t0.Exit menu/n/n" echo -en "\\t\\tEnter option: " #-en 显示该行,而不在行尾添加换行符
创建菜单的最后一部分是获取客户的输入。我们通过read命令来完成
read -n 1 option
1.2、创建菜单函数
为每个选项创建独立的函数,然后再在case语句中调用即可;
function diskspace { clear echo "This is where the diskspace commands will go." }
在shell脚本菜单中,有助于解决问题的一种做法是将菜单布局本身作为函数来创建:
function menu { clear echo echo -e "\\t\\t\\tSys Admin Menu\\n" echo -e "\\t1.Display disk space" echo -e "\\t2.Display logged on users" echo -e "\\t3.Display memory usage" echo -e "\\t0.Exit program\\n\\n" echo -en "\\t\\tEnter option: " read -n 1 option }
这样,我们只要代用menu函数,就可以很容易的随时再显示该菜单即可。
1.3、添加菜单逻辑
再添加逻辑关系。需要使用case语句来完成
menu case $option in 0) break ;; 1) diskspace ;; 2) whoseon ;; 3) memusage ;; *) clear echo "Sorry, wrony selection" ;; esac
1.4、将其全部组合在一起
有了选项,函数,与逻辑关系,我们需要将他们组合起来:
#!/bin/bash # simple script menu function diskspace { clear df -k } function whoseon { clear who } function memusage { clear cat /proc/meminfo } function menu { clear echo echo -e "\\t\\t\\tSys Admin Menu\\n" echo -e "\\t1.Display disk space" echo -e "\\t2.Display logged on users" echo -e "\\t3.Display memory usage" echo -e "\\t0.Exit program\\n\\n" echo -en "\\t\\tEnter option: " read -n 1 option } while [ 1 ] do menu case $option in 0) break ;; 1) diskspace ;; 2) memusage ;; *) clear echo "Sorry, wrong selection";; esac echo =en "\\n\\m\\t\\tHit any key to continue" read -n 1 line done clear
多加了一个while循环,不断重复菜单,直到用户选择0,则跳出循环;
这个脚本模板用于创建任何的shell脚本菜单界面。它同乐与用户交互的一种简单方式;
1.5、使用select命令
select命令容许从单命令行创建菜单。然后获取输入的答案并自动处理它。
select variable in list do commands done
列表参数是用空格隔开的构建菜单的的文本项列表。select命令将列表中的每一项显示为一个编号选项,然后为选择显示一个特殊的提示符(由PS3环境变量定义)
#!/bin/bash # using select in the menu function diskspace { clear df -k } function whoseon { clear who } function memusage { clear cat /paroc/meminfo } PS3="Enter option: "
#自动完成页面布局,和获取输入的答案; select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program" do case $option in "Exit program") break ;; "Display disk space") diskspace ;; "Display logged on users") whoseon ;; "Display memory usage") memusage ;; *) clear echo "Sorry, wrong selection" ;; esac done clear
运行该脚本:
2、添加颜色
现在脚本变得较为复杂,则需要颜色来区分;
2.1、ANSI转移码
ANSI转意码以控制序列显示器(GSI)开头,后面表示在显示器上执行的操作数据。要控制显示格式,必须使用选择图形再现(SGR select graphic rendition)
格式为:CSIn[;k]m
m代表SGR转意码。n和k参数定义所使用的显示控制。显示控制参数有3类:1、效果控制代码;2、前景色控制代码;3、背景色控制代码。如下图:
例如:斜体字 GSI3m
例如:斜体闪烁字 GSI3;5m
前景色和背景色则用两位数来控制:
指定白色为前景色:GSI37m
设置白色为背景:GSI47m
在个控制码中,可以将这两种属性组合在一起。因此,要将背景色设置为黑丝,前景色设置为红色,可以发送代码:GSI31;40m
2.2、显示ANSI转意码
我们还需要echo命令,向发送普通文本一样,将ANSI转意码发送到终端会话。
一个完整的转意码:^[[0m #控制代码0,它将把显示重置为默认设置。
$ echo ^[[41mThis is a test
这次测试后,新的shell提示符将恢复其原来的颜色方案:
$ echo ^[[1mThis is a test^[[0m This is a test
如果需要设置背景色和前景色,ANSI转意控制码容许在一个转移序列中指定两个转意码:
$ echo "^[[33;44mThis is a test^[[0m" This is a test
2.3、在脚本中使用颜色
在shell中调用ANSI转意控制码。
#!/bin/bash # menu using colors function diskspace { clear df-k } funciton whoseon clear who } function memusage { clear cat /proc/meminfo } function menu { clear echo echo -e "\\t\\t\\tSys Admin Menu\\n" echo -e "\\t1.Display disk space" echo -e "\\t2.Display logged on users" echo -e "\\t3.Display memory usage" echo -e "^[[1m\\t0. Exit program\\n\\n^[[0m^[[44;33m" echo -en "\\t\\tEnter option: " read -n 1 option } echo "^[[44;33m" while [ 1 ] do menu case $option in 0) break ;; 1) diskapace ;; 2) whoseon ;; 3) memuage ;; *) clear echo -e "^[[5m\\t\\t\\tSorry,wrong selection^[[0m^[[44;33m";; esac echo -en "\\n\\n\\t\\t\\tHit any key to continue" read -n 1 line done echo "^[[0m" clear
3、制作窗口
dialog工具为我们制作类似于windows的对话框
3.1、dialog软件包
widget是dialog中的小部件,可以用来包装选项;
用法:dialog --widget parameters
parameters定义该小部件窗口的代销以及它所虚的任何文本。
每个对话框小部件均以两种形式提供输出:1、使用STDERR;2、使用退出代码状态;
如果小部件返回任何数据,例如一个菜单选项,dialog命令将该数据发送到STDERR。可以使用标准的bash shell技术讲STDERR输出重定向至另外一个文件或文件描述;
用法:dialog --inputbox "Enter your age:" 10 20 2>age.txt
1、msgbox小部件
显示简单的信息
dialog --msgbox test height width #定义height和width参数自动调整文本以适应所穿件的窗口大小。--title参数定义标题
dialog --title Testing --msgbox "This is a test" 10 20
2、yesno小部件
提供yes/no选项的串口
dialog --title "Please answer" --yesno "Is this thing on?" 10 20
echo $?
3、输入框小部件
inputbox小部件,为用户输入文本字符串,提供了一个简单的文本框。
dialog --inputbox "Enter your age:" 10 20 2>age.txt
echo $?
cat age.txt
4、文本框小部件
在这个文本框内可以输入大量的提示信息
dialog --texbox /etc/passwd 15 45
5、菜单小部件
提供菜单选项
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3"Display memory usage" 4 "Exit" 2>text.txt
6、fselect小部件
使用文件名时,fselect小部件机器方便。无需前置用户输入文件名,而是利用fselect小部件流量文件从而选择文件。
dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
分为左侧目录列表;右侧目录列表;和输入列表;
3.2、dialog选项
dialog还有很多的长选线,提供参数选择;
--backtitle 选项时穿件贯穿脚本的通用菜单标题的一种时分方便的方法。如果为每个对话框窗口自定,该选项将贯穿应用程序始终,为脚本穿件专业级的外观;
3.3、在脚本中使用dialog命令
使用dialog命令注意两点:1、如果cancel或者no按钮可用,请检查dialog命令的退出状态;2、重定向STDERR以获取输出值;
#!/bin/bash # using dialog to create a menu temp=`mktemp -t test.XXXXXX` temp2=`mktemp -t test2.XXXXXX` function diskspace { df -k > $temp dialog --textbox $temp 20 60 } function whoseon { who > $temp dialog --textbox $temp 20 50 } function memusage { cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } while [ 1 ] do dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display user" 3 "Display memory usage" 0 "Exit" 2> $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) dialog --msbox "Sorry, invalid selection" 10 30 esac done rm -f $temp 2> /dev/null rm -f $temp2 2> /dev/null
4、获取图形
如果需要更多的图形,无论是KDE好事GNOME周免都扩充了dialog命令的思想。各自都有自己的X Windows图形小不讲;
kdialog和zenity分别就是KDE和GNOME的桌面图形工具;
4.1、KDE环境
kdialog工具;
1、kdialog小部件
使用格式:kdialog display-options window-options arguments
使用kdialog窗口小部件时,会在KDE桌面环境下显示为一个独立窗口,而不是包含在终端模拟器会话中
checklist和radiolist小部件容许您定义列表中的单独项目,以及它们是否默认选中:
kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off
2、使用kdialog
使用对话框小部件。使得kdialog窗口输出使用STDOUT而非STDERR输出;
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
4.2、GNOME环境
GNOME图形化环境支持两种可以生成标准串口流行软件包:1、gdialog;2、zenity;
zenity是最常见的软件包。本地介绍zenity的功能并说明如何在shell及保本中使用它。
1、zenity小部件
zenity程序的工作方式与kdialog程序和dialog程序略有不同。许多类型的小不讲要在命令行上使用附加的选项来定义,而不是将它们作为选项的参数。
$ zenity --calendar
11/25/2019
$ zenity --file=selection
/home/ubuntu/menu5
2、脚本中使用zenity
zenity不遵守dialog和kdialog中使用的选项特定,因此将任何现有的交互式脚本转换为zenity都具有挑战性;
#!/bin/bash # using zenity to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 10 } function whoseon { who > $temp zenity --text-info --title "Logged in user" --filename=$temp --width 500 --height 10 } function memusage { cat /proc/meminfo > $temp zenity --text-info --title "Memory usage" --filename=$temp --with 300 --height 500 } while [ 1 ] do zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display disk space" FALSE "Display users" FALSE "Disyplay memory usage" FALSE "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in "Display disk space") diskspace ;; "Display users") whoseon ;; "Display memory usage") memusage ;; Exit) break ;; *) zenity --info "Sorry, invalid selection" exac done
以上是关于在脚本中添加颜色的主要内容,如果未能解决你的问题,请参考以下文章