Linux_《Linux命令行與shell腳本編程大全》第十八章學習總結

時間:2017年12月04日星期一
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十八章學習總結shell

第十八章:圖形化桌面環境中的腳本編程

本章內容編程

  • 建立文本菜單
  • 建立文本窗口部件
  • 添加X Window圖形

18.1 建立文本菜單

建立交互式shell腳本最經常使用的方法是使用菜單,shell腳本菜單的核心是case命令,case命令會根據用戶在菜單上的選擇來執行特定命令。bash

18.1.1 建立菜單佈局

經常使用命令函數

clear

清理出如今屏幕上的文本佈局

echo -e

在echo命令中輸出格式化的字符串,方便菜單項佈局學習

echo -en

輸出指定格式化字符串,但不會換行,光標在末尾等待用戶輸入this

read -n 1

使用read命令-n選項來限制自讀取一個字符spa

簡單示例命令行

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 "\t4. Exit menu\n\n"
echo -en "\t\tEnter option: "

read -n 1 option

18.1.2 建立菜單函數

  • shell腳本菜單選項做爲一組獨立的函數實現起來更爲容易
  • 爲每一個菜單選項建立獨立的shell函數
  • 經過會爲尚未實現的函數先建立一個樁函數
  • 將菜單佈局自己做爲一個函數來建立

簡單示例code

function diskspace {
    clear
    echo "This is where the diskspace commands will go"
}

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 "\t4. Exit menu\n\n"
    echo -en "\t\tEnter option: "
    read -n 1 option
}

18.1.3 添加菜單邏輯

  • 建立程序邏輯將菜單佈局和函數結合起來
  • case命令根據菜單中輸入的字符來調用相應的函數
  • 使用星號(*)來處理全部不正確的菜單項

簡單示例

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

18.1.4 整合shell腳本菜單

完整例子

編寫menu1腳本

#!/bin/bash

function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusagee {
    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 menu\n\n"
    echo -en "\t\tEnter option: "
    read -n 1 option
}

while [ 1 ]
do
    menu
    case $option in
    0)
       break ;;
    1)
       diskspace ;;
    2)
       whoseon ;;
    3)
       memusage ;;
    *)
       clear
       echo "Sorry, wrong selection";;
    esac
    echo -en "\n\n\t\t\tHit any key to continue"
    read -n 1 line
done
clear

18.1.5 使用select命令

命令格式:

select variable in list
do
    commands
done

命令說明:

  • list參數是由空格分割的文本選項列表,這些列表構成了整個菜單
  • select命令獲取輸入的答案並自動處理

編寫smenu1腳本

#!/bin/bash

function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusagee {
    clear
    cat /proc/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

18.2 製做窗口

18.2.1 dialog包

dialog命令使用命令行參數來決定生成哪一種窗口部件

安裝dialog包以及須要的庫

sudo apt-get install dialog

dialog部件

  • 部件:描述
  • calendar:提供選擇日期的日曆
  • checklist:顯示多個選項(其中每一個選項都能打開或關閉)
  • form:構建一個帶有標籤以及文本字段(能夠填寫內容)的表單
  • fselect:提供一個文件選擇窗口來瀏覽選擇文件
  • guage:顯示完成的百分比進度條
  • infobox:顯示一條消息,但不用等待迴應
  • inputbox:提供一個輸入文本用的文本表單
  • inputmenu:提供一個可編輯的菜單
  • menu:顯示可選擇的一系列選項
  • msgbox:顯示一條消息,並要求用戶選擇ok按鈕
  • pause:顯示一個進度條來顯示暫按期間的狀態
  • passwordbox:顯示一個文本框,但會隱藏輸入的文本
  • passwordform:顯示一個帶標籤和隱藏穩定字段的表單
  • radiolist:提供一組菜單選項,但只能選擇其中一個
  • tailbox:用tail命令在滾動窗口中顯示文件的內容
  • tailboxbg:跟 tailbox同樣,可是在後臺模式中運行
  • textbox:在滾動窗口中顯示文件的內容
  • timebox:提供一個選擇小時、分鐘和秒數的窗口
  • yesno:提供一個帶有Yes和No按鈕的簡單消息

使用格式

dialog –widget parameters

1.msgbox部件

使用說明

dialog –title Testing –msgbox text height width
  • text參數是在窗口中顯示的字符串
  • dialog命令會根據height和width參數建立的窗口大小來自動換行
  • title參數指定窗口的標題

實例

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

2.yesno部件

使用說明

  • yesno部件容許用戶對窗口中顯示的問題選擇yes或no
  • 用戶選擇了No按鈕,退出狀態碼是1;若是選擇了Yes按鈕,退出狀態碼就是0

實例

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

3.inputbox部件

使用說明

  • inputbox提供一個簡單的文本框區域來輸入文本字符串
  • dialog命令會將文本字符串的值發給STDERR,經過重定向STDERR來獲取用戶輸入
  • 用戶選擇了OK按鈕,退出狀態碼是0;反之,退出狀態碼就是1

實例

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

4.textbox部件

使用說明

  • textbox部件在窗口中顯示大量信息

實例

dialog --textbox /etc/passwd 15 45

5.menu部件

使用說明

  • menu部件用來建立文本菜單的窗口版本
  • dialog命令會將選定的菜單項文本發送到STDERR,經過重定向STDERR來獲取選擇

實例

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

6.fselect部件

使用說明

  • 使用fselect部件來瀏覽文件的位置並選擇文件

實例

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

18.2.2 dialog選項

  • dialog命令有不少不一樣的選項
  • --title選項能夠設置窗口頂部的標題
  • --backlist選項能夠爲腳本中的菜單建立公共標題
  • 還有其它許多選項,此處省略

18.2.3 在腳本中使用dialog命令

若是要在腳本中使用dialog命令,則必須遵照如下規範

  • 若是有Cancel或No按鈕,檢查dialog命令的退出狀態碼
  • 經過重定向STDERR來獲取輸出值

使用dialog部件來建立系統管理菜單

編寫menu3腳本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    dialog --textbox $temp1 20 60
}

function whoseon {
    who > $temp1
    dialog --textbox $temp1 20 50
}

function memusage {
    cat /proc/meminfo > $temp1
    dialog --textbox $temp1 20 50
}

while [ 1 ]
do
    dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 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 --msgbox "Sorry, invalid selection" 10 30
    esac
done

rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.3 使用圖形

18.3.1 KDE環境

  • KDE圖形化環境默認包含kdialog包
  • kdialog包使用kdialog命令在KDE桌面上生成相似於dialog式部件的標準窗口
  • 須要檢查系統是否已安裝kdialog包

1.kdialog部件

使用說明

格式:

kdialog display-options window-options arguments
  • window-options選項指定使用哪一種類型的窗口部件

實例:

kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off

kdialog窗口選項

  • 選項:描述
  • --checklist title [tag item status]:帶有狀態的多選列表菜單,能夠表面選項是否被選定
  • --error text:錯誤消息框
  • --inputbox text [init]:輸入文本框。能夠用init值來制定默認值
  • --menu title [tag item]:帶有標題的菜單選擇框,以及用tag標識的選項列表
  • --msgbox text:顯示指定文本的簡單消息框
  • --password text:隱藏用戶輸入的密碼輸入文本框
  • --radiolist title [tag item status]:帶有狀態的單選列表菜單,能夠表面選項是否被選定
  • --separate-output:爲多選列表和單選列表菜單返回按行分開的選項
  • --sorry text:「對不起」消息框
  • --textbox file [width] [height]:顯示file的內容的文本框,能夠指定width和height
  • --title title:爲對話窗口的TitleBar區域指定一個標題
  • --warningyesno text:帶有Yes和No按鈕的警告消息框
  • --warningcontinuecancel text:帶有Continue和Cancel按鈕的警告消息框
  • --warningyesnocancel text:帶有Yes、No和Cancel按鈕的警告消息框
  • --yesno text:帶有Yes和No按鈕的提問框
  • --yesnocancel text:帶有Yes、No和Cancel按鈕的提問框

2.使用kdialog

使用kdialog建立系統管理菜單

編寫menu4腳本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    df -k > $temp1
    kdialog --textbox $temp1 1000 10
}

function whoseon {
    who > $temp1
    kdialog --textbox $temp1 500 10
}

function memusage {
    cat /proc/meminfo > $temp1
    kdialog --textbox $temp1 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" 10 30
    esac
done

rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.3.2 GNOME環境

GNOME圖形化環境支持兩種流行的可生成標準窗口的包

  • gdialog
  • zenity

1.zenity

zenity窗口部件

  • 選項:描述
  • --calendar:顯示一整月日曆
  • --entry:顯示文本輸入對話窗口
  • --error:顯示錯誤消息對話窗口
  • --file-selection:顯示完整的路徑名和文件名對話窗口
  • --info:顯示信息對話窗口
  • --list:顯示多選列表或單選列表對話窗口
  • --notification:顯示通知圖標
  • --progress:顯示進度條對話窗口
  • --question:顯示yes/no對話窗口
  • --scale:顯示可調整大小的窗口
  • --text-info:顯示含有文本的文本框
  • --waring:顯示警告對話窗口

2.在腳本中使用zenity

編寫menu5腳本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    df -k > $temp1
    zenity --text-info --title "Disk space" --filename=$temp1 --width 750 --height 10
}

function whoseon {
    who > $temp1
    zenity --text-info --title "Logged in users" --filename=$temp1 --width 500 --height 10
}

function memusage {
    cat /proc/meminfo > $temp1
    zenity --text-info --title "Memory usage" --filename=$temp1 --width 300 --height 500
}

while [ 1 ]
do
    zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display diskspace" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2
    if [ $? -eq 1 ]
    then
        break
    fi

    selection=$(cat $temp2)

    case $selection in
    "Display diskspace")
        diskspace ;;
    "Display users")
        whoseon ;;
    "Display memory usage")
        memusage ;;
    Exit)
        break ;;
    *)
        zenity --info "Sorry, invalid selection" 10 30
    esac
done

rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.4 小結

本章主要講解了如何在shell腳本中建立菜單以及在圖形化環境中編寫交互式腳本

相關文章
相關標籤/搜索