1. 程式人生 > 實用技巧 >十三、圖形化桌面環境指令碼程式設計

十三、圖形化桌面環境指令碼程式設計

建立選單佈局

echo -e選項可以輸出製表符和換行符

echo -en選項會去掉末尾換行符,這樣游標會一直在行尾等待使用者輸入。

然後使用read -n 1 option限制只讀取第一個字元

[root@tzPC 18Unit]# cat test1.sh 
#!/bin/bash
clear
echo
echo -e "\t\ttSys 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

這樣選單佈局執行的結果是

建立選單函式

為每個選單選項都建立獨立的函式。

可以為還沒有實現功能的函式建立一個樁函式,說明這個函式的用途。

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

可以將選單佈局本身寫入函式

function menu {
    clear
    echo
    echo -e "\t\ttSys 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 }

新增選單邏輯

使用case命令處理命令列引數

menu #先列印選單佈局
case $option in
0)
    break ;;
1)
    diskpace ;;
2) whoseon ;; 3) memusage ;; *) clear echo "Sorry, wrong selection" ;; esac

組後將各個部分整合成一個指令碼

[root@tzPC 18Unit]# cat test1.sh
#!/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\ttSys 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 #使用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

這個指令碼很炫,可以自己寫一下試一下。

使用select命令寫選單佈局

語法格式

select variable in list
do
    commands
done

lis引數是由空格分隔的文字選項列表,select會將每個列表前加上一個編號。

將上面的指令碼略微改動

[root@tzPC 18Unit]# cat test2.sh 
#!/bin/bash
#simple script menu
function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusage {
    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

注意上面的PS3變數

PS3 是Prompt String 3的縮寫,它是Linux/Unix下的一個用於控制select命令建立的選單提示資訊的環境變數,如果不寫那麼提示語句的位置會變成?符號

製作視窗

dialog包可以建立標準的視窗對話方塊。

dialog命令使用命令列引數來決定生成哪種視窗部件。

dialog部件引數在書P384,太多我不想打,哈哈

語法格式

dialog --widget parameters

其中widget為部件名

parameters定義視窗的大小以及部件需要的文字

每個部件輸出方式

  1. 使用STDERR檔案描述符
  2. 使用退出狀態碼

通過dialog命令的退出狀態碼確定使用者選擇的按鈕

dialog命令的退出狀態碼為0,說明使用者選擇了yes按鈕

退出狀態碼為1,使用者選擇的no按鈕

狀態碼值可用$?變數確定

部件返回的資料會發送到STDERR檔案描述符可通過重定向到檔案或者其他檔案描述符獲知

[root@tzPC 18Unit]# dialog --inputbox "Enter your age:" 10 20 2> age.txt

可以重定向到檔案看到值20,並且沒有換行符

[root@tzPC 18Unit]# cat age.txt 
20[root@tzPC 18Unit]# 

msgbox部件

在視窗顯示一條訊息,點選OK才會消失

語法格式

dialog --msgbox text height width

--title引數在視窗頂部寫一個標題

[root@tzPC 18Unit]# dialog --title Testing --msgbox "This is a test" 10 20

yesno部件

擴充套件了msgbox部件的功能,多了yes跟no按鈕

[root@tzPC 18Unit]# dialog --title "Please answer" --yesno "Is this thing on?" 10 20

此時如果選擇了yes退出碼就為0,選擇no退出碼為1

[root@tzPC 18Unit]# echo $?
0

inputbox部件

多一個文字框用來輸入文字,輸入的文字會發送給STDERR,需要重定向才能獲取文字框裡的值。

上面的例子寫過。

textbox部件