第三天:條件選擇
大 綱
應用執行個體分析
條件測試
if…else…fi
case…in…esac
實現功能菜單:
執行指令碼後
按1,顯示目前時間
按2,顯示CPU負載
按3,顯示剩餘記憶體
按0,退出指令碼
按其他字元,提示超出選擇範圍後退出
分析步驟。
#date +%T
uptime awk截取
free –m
條件測試格式
#test –option obj
#[ -option obj ]
返回結果
- 運算式內容測試結果是真的
- 運算式內容測試結果是假的
測試的對象分類
執行結果(執行成功或失敗)
檔案(檔案是否存在等)
文本(是否一致)
數字(數值比較)
條件測試的選項
選項 |
作用 |
-d |
目錄 |
-e |
是否存在 |
-f |
是否是普通檔案 |
-s |
檔案大小是否等於0 |
-r |
是否可讀 |
-w |
是否可寫 |
-x |
是否可執行 |
邏輯操作符號
選項 |
作用 |
-a |
與操作 |
-o |
或操作 |
! |
非操作 |
執行個體:
#test –e /etc/passwd –a –e /etc/shadow 中間是a與操作,則都為0才得0
#test –e /etc/passwd –o –e /etc/groups 中間是o或操作,則有一真則真0
字串操作符
== 兩個字串相等
!= 兩個字串不相等
-z Null 字元串
-n 非Null 字元串
執行個體:
#test –z $LOGNAME
#echo $LOGNAME
#echo $?
數值比較操作符
符號 |
說明 |
-eq |
等於 |
-ne |
不等於 |
-gt |
大於 |
-lt |
小於 |
-ge |
大於等於 |
-le |
小於等於 |
if…else…fi 條件選擇
if控制結構的基本格式:
if條件 #判斷開始 可以是命令,也可以是test語句
then #如果條件為真 反值真0則執行
命令1 #執行命令1
else #如果條件為假 反值假1則執行
命令2 #執行命令2
fi #判斷結束
執行個體(if…else…fi)1
inputtest.sh
#!/bin/bash
#input test
echo –n “Enter your name:”
read name
#did the user just hit return
if [ "${name}" == "" ]
then
echo “You did not enter any information”
else
echo “Your name: ${name}”
fi
執行個體(if…else…fi)2
filecopy.sh
#!/bin/bash
#file copy
if cp /etc/passwd passwd.bak 2>/dev/null 2>/dev/null 丟掉錯誤提示
then
echo “Good Copy!”
else
echo “`basename $0`: error,could not copy”
fi
if…else…fi的嵌套 (兩層的嵌套)
if 條件1;then
if 條件2;then
命令1
else
命令2
else
if條件3;then
命令3
else
命令4
fi
case…in…esac條件選擇 (比較靈活的方式)
case語句多用於較多分支判斷
case格式: (多種模式,只匹配和variable相等的模式)
case variable in
模式1)命令1…;;
模式2)命令2…;;
esac
匹配模式
* 匹配任一字元
? 匹配任意單字元
[] 匹配字元範圍
case…in.esac執行個體1
#!/bin/bash
#case select
echo –n “enter a number from 1 to 5:”
read NUM
case $NUM in
1) echo “you select 1″ ;;
2) echo “you select 2″ ;;
3) echo “you select 3″ ;;
4) echo “you select 4″ ;;
5) echo “you select 5″ ;;
*) echo “basename $This is not between 1 and 5″
esac
case…in.esac執行個體2
題目是:學生的考試成績是0-100分,在85以上的要提示you are the best!,在70-84顯示you get a good mark! ,在60-74的顯示come on!,60分以下顯示You must study hard!
#!/bin/bash
echo –n “please input your mark:”
read mark
case $mark in
100|9[0-9]|8[5-9]) echo “you are the best!”;; 100、90-99、85-89
8[0-4]|7[0-9]) echo “you get a good mark!”;; 80-84、70-79
7[0-4]|6[0-9]) echo “come on!”;; 70-74、60-69
[0-5][0-9]) echo “You must study hard!”;; 00-59
esac
解決今天的問題
使用if…else…fi的方式對輸入的變數進行判斷。
在每個判斷的分支上執行相應的語句。
menu.sh
#!/bin/bash
clear
echo “——————–menu—————–”
echo “1) Show Time”
echo “2) CPU load”
echo “3) Memory free”
echo “0) Exit”
echo “——————————————–”
echo -n “Enter you chose [0-3]:”
read NUM
if [ ${NUM} -lt 0 -o ${NUM} -gt 3 ]
then
echo “This is not between 0-3.”
else
if [ "${NUM}" == "1" ]
then
echo “`date +%T`”
else
if [ "${NUM}" == "2" ]
then
echo “`uptime | awk -F ‘[,:]‘ ‘{print $7}'`”
else
if [ "${NUM}" == "3" ]
then
echo “`free -m | awk ‘$1==”Mem:”{print $4}'`”
else
exit
fi
fi
fi
fi
本節課回顧:
條件測試的類型
檔案測試
文本測試
數值測試
邏輯測試
if…else…fi條件選擇結構
case…in…esac
課後測試
1、修改menu.sh 採用非菜單式,參數傳遞方式來進行選擇。 例如 #./menu.sh 1 輸出時間
2、使用case方式來實現該菜單選擇方式
Sudu答案:(難免會有錯誤,但是可以實現成功)
1、修改menu.sh後得出
#!/bin/bash
if [ $1 -lt 0 -o $1 -gt 3 ]
then
echo “This is not between 0-3.”
else
if [ "$1" == "1" ]
then
echo “`date +%T`”
else
if [ "$1" == "2" ]
then
echo “`uptime | awk -F ‘[,:]‘ ‘{print $7}'`”
else
if [ "$1" == "3" ]
then
echo “`free -m | awk ‘$1==”Mem:”{print $4}'`”
else
exit
fi
fi
fi
fi
2、 #!/bin/bash
clear
echo “——————–menu—————–”
echo “1) Show Time”
echo “2) CPU load”
echo “3) Memory free”
echo “0) Exit”
echo “——————————————–”
echo -n “Enter you chose [0-3]:”
read NUM
case $NUM in
1) date +%T;;
2) uptime | awk -F ‘[,:]‘ ‘{print $7}';;
3) free -m | awk ‘$1==”Mem:”{print $4}';;
0) exit ;;
*) echo “This is not between 0-3.” ;;
esac
今天收穫還是比較多的。 半個小時的教程看了將近3個小時。
雖然說if…else…fi比較容易理解,但是用case感覺簡單很多,呵呵,看個人喜好吧。
每天看來看一節教程就足夠了。 看多了頭也會暈的。 呵呵。 繼續學習吧~