在腳本中添加顏色

  shell腳本一直單調,可是在圖形環境下運行,除了read和echo語句外,還有其餘許多與腳本用戶交互的方法。這一節深刻介紹幾種不一樣的方法。shell

一、建立文本菜單

  建立交互式的shell文本,主要使用case語句ubuntu

  1.一、建立菜單佈局

    肯定所要顯示的內容: echo -e #-e指定了輸出內容中必需要包含製表符和換行符。windows

    例如:echo -e "1.\tDisplay disk space"bash

    設置菜單:函數

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.二、建立菜單函數

    爲每一個選項建立獨立的函數,而後再在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函數,就能夠很容易的隨時再顯示該菜單便可。this

  1.三、添加菜單邏輯

    再添加邏輯關係。須要使用case語句來完成spa

menu
case $option in
0)
    break ;;
1)
    diskspace ;;
2)
    whoseon ;;
3)
    memusage ;;
*)
    clear
    echo "Sorry, wrony selection" ;;
esac

  1.四、將其所有組合在一塊兒

    有了選項,函數,與邏輯關係,咱們須要將他們組合起來:

#!/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.五、使用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.一、ANSI轉移碼

    ANSI轉意碼以控制序列顯示器(GSI)開頭,後面表示在顯示器上執行的操做數據。要控制顯示格式,必須使用選擇圖形再現(SGR select graphic rendition)

    格式爲:CSIn[;k]m

    m表明SGR轉意碼。n和k參數定義所使用的顯示控制。顯示控制參數有3類:一、效果控制代碼;二、前景色控制代碼;三、背景色控制代碼。以下圖:

    例如:斜體字 GSI3m

    例如:斜體閃爍字 GSI3;5m

    前景色和背景色則用兩位數來控制:

    指定白色爲前景色:GSI37m

    設置白色爲背景:GSI47m

    在個控制碼中,能夠將這兩種屬性組合在一塊兒。所以,要將背景色設置爲黑絲,前景色設置爲紅色,能夠發送代碼:GSI31;40m

  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.三、在腳本中使用顏色

    在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

三、製做窗口

  dialog工具爲咱們製做相似於windows的對話框

  3.一、dialog軟件包

    widget是dialog中的小部件,能夠用來包裝選項;

    用法:dialog --widget parameters

    parameters定義該小部件窗口的代銷以及它所虛的任何文本。

    每一個對話框小部件均以兩種形式提供輸出:一、使用STDERR;二、使用退出代碼狀態;

    若是小部件返回任何數據,例如一個菜單選項,dialog命令將該數據發送到STDERR。可使用標準的bash shell技術講STDERR輸出重定向至另一個文件或文件描述;

    用法:dialog --inputbox "Enter your age:" 10 20 2>age.txt

    一、msgbox小部件

    顯示簡單的信息

    dialog --msgbox test height width  #定義height和width參數自動調整文本以適應所穿件的窗口大小。--title參數定義標題

    dialog --title Testing --msgbox "This is a test" 10 20

    二、yesno小部件

    提供yes/no選項的串口

    dialog --title "Please answer" --yesno "Is this thing on?" 10 20

    echo $?

    三、輸入框小部件

    inputbox小部件,爲用戶輸入文本字符串,提供了一個簡單的文本框。

    dialog --inputbox "Enter your age:" 10 20 2>age.txt

    echo $?

    cat age.txt

    四、文本框小部件

    在這個文本框內能夠輸入大量的提示信息

    dialog --texbox /etc/passwd 15 45

    五、菜單小部件

    提供菜單選項

    dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3"Display memory usage" 4 "Exit" 2>text.txt

    六、fselect小部件

    使用文件名時,fselect小部件機器方便。無需前置用戶輸入文件名,而是利用fselect小部件流量文件從而選擇文件

    dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

    分爲左側目錄列表;右側目錄列表;和輸入列表;

  3.二、dialog選項

    dialog還有不少的長選線,提供參數選擇;

    --backtitle 選項時穿件貫穿腳本的通用菜單標題的一種時分方便的方法。若是爲每一個對話框窗口自定,該選項將貫穿應用程序始終,爲腳本穿件專業級的外觀;

  3.三、在腳本中使用dialog命令

    使用dialog命令注意兩點:一、若是cancel或者no按鈕可用,請檢查dialog命令的退出狀態;二、重定向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

四、獲取圖形

  若是須要更多的圖形,不管是KDE好事GNOME周免都擴充了dialog命令的思想。各自都有本身的X Windows圖形小不講;

  kdialog和zenity分別就是KDE和GNOME的桌面圖形工具;

  4.一、KDE環境

    kdialog工具;

    一、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

    二、使用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.二、GNOME環境

    GNOME圖形化環境支持兩種能夠生成標準串口流行軟件包:一、gdialog;二、zenity;

    zenity是最多見的軟件包。本地介紹zenity的功能並說明如何在shell及保本中使用它。

    一、zenity小部件

    zenity程序的工做方式與kdialog程序和dialog程序略有不一樣。許多類型的小不講要在命令行上使用附加的選項來定義,而不是將它們做爲選項的參數。

    $ zenity --calendar

    11/25/2019

    $ zenity --file=selection

    /home/ubuntu/menu5

    二、腳本中使用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
相關文章
相關標籤/搜索