zoukankan      html  css  js  c++  java
  • 在脚本中添加颜色

      shell脚本一直单调,但是在图形环境下运行,除了read和echo语句外,还有其他许多与脚本用户交互的方法。这一节深入介绍几种不同的方法。

    1、创建文本菜单

      创建交互式的shell文本,主要使用case语句

      1.1、创建菜单布局

        确定所要显示的内容: echo -e #-e指定了输出内容中必须要包含制表符和换行符。

        例如:echo -e "1. Display disk space"

        设置菜单:

    clear
    echo
    echo -e "			Sys Admin Menu
    "
    echo -e "	1.Display disk space"
    echo -e "	2.Display logged on users"
    echo -e "	3.Display memory usage"
    echo -e "	0.Exit menu/n/n"
    echo -en "		Enter 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 "			Sys Admin Menu
    "
        echo -e "	1.Display disk space"
        echo -e "	2.Display logged on users"
        echo -e "	3.Display memory usage"
        echo -e "	0.Exit program
    
    "
        echo -en "		Enter 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 "			Sys Admin Menu
    "
        echo -e "	1.Display disk space"   
        echo -e "	2.Display logged on users"
        echo -e "	3.Display memory usage"
        echo -e "	0.Exit program
    
    "
        echo -en "		Enter 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 "
    m		Hit 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 "			Sys Admin Menu
    "
        echo -e "	1.Display disk space"
        echo -e "	2.Display logged on users"
        echo -e "	3.Display memory usage"
        echo -e "^[[1m	0. Exit program
    
    ^[[0m^[[44;33m"
        echo -en "		Enter 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			Sorry,wrong selection^[[0m^[[44;33m";;
        esac
        echo -en "
    
    			Hit 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
  • 相关阅读:
    iOS如何隐藏状态栏,包括网络标志、时间标志、电池标志等
    xcrun: error: active developer path
    我们很少有机会看到一个人的所有面
    默妹(二)
    Bootstrap3的响应式缩略图幻灯轮播效果设计
    纯CSS3实现图片展示特效
    解决div设置浮动,高度消失
    解决css设置背景透明,文字不透明
    从零开始学习jQuery (六) jquery中的AJAX使用
    如何利用开源思想开发一个SEO友好型网
  • 原文地址:https://www.cnblogs.com/BurnovBlog/p/10802903.html
Copyright © 2011-2022 走看看