[b]第三天:条件选择[/b]
[b]大 纲[/b]
应用实例分析
条件测试
if…else…fi
case…in…esac
[b]实现功能菜单[/b]:
执行脚本后
按1,显示当前时间
按2,显示CPU负载
按3,显示剩余内存
按0,退出脚本
按其他字符,提示超出选择范围后退出
[img]http://files.jb51.net/upload/201012/20101225174520155.png[/img]
分析步骤。
#date +%T
uptime awk截取
free –m
条件测试格式
#test –option obj
#[ -option obj ]
返回结果
[list=1]
[*]
表达式内容测试结果是真的
[/*][*]
表达式内容测试结果是假的
[/*][/list]
[b]测试的对象分类[/b]
执行结果(执行成功或失败)
文件(文件是否存在等)
文本(是否一致)
数字(数值比较)
[b]条件测试的选项[/b]
| 选项 |
作用 |
| -d |
目录 |
| -e |
是否存在 |
| -f |
是否是普通文件 |
| -s |
文件大小是否等于0 |
| -r |
是否可读 |
| -w |
是否可写 |
| -x |
是否可执行 |
[b]逻辑操作符号[/b]
|
选项
|
作用 |
|
-a
|
与操作 |
|
-o
|
或操作 |
|
!
|
非操作 |
实例:
#test –e /etc/passwd –a –e /etc/shadow 中间是a与操作,则都为0才得0
#test –e /etc/passwd –o –e /etc/groups 中间是o或操作,则有一真则真0
[b]字符串操作符[/b]
== 两个字符串相等
!= 两个字符串不相等
-z 空字符串
-n 非空字符串
实例:
#test –z $LOGNAME
#echo $LOGNAME
#echo $?
[img]http://files.jb51.net/upload/201012/20101225174520643.png[/img]
[b]数值比较操作符[/b]
|
符号
|
说明 |
|
-eq
|
等于 |
|
-ne
|
不等于 |
|
-gt
|
大于 |
|
-lt
|
小于 |
|
-ge
|
大于等于 |
|
-le
|
小于等于 |
[b]if…else…fi 条件选择[/b]
if控制结构的基本格式:
if条件 #判断开始 可以是命令,也可以是test语句
then #如果条件为真 反值真0则执行
命令1 #执行命令1
else #如果条件为假 反值假1则执行
命令2 #执行命令2
fi #判断结束
[b]实例(if…else…fi)1[/b]
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
[img]http://files.jb51.net/upload/201012/20101225174520221.png[/img]
[b]实例(if…else…fi)2[/b]
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
[img]http://files.jb51.net/upload/201012/20101225174520184.png[/img]
[b]if…else…fi的嵌套 (两层的嵌套)[/b]
[b] [/b]if 条件1;then
if 条件2;then
命令1
else
命令2
else
if条件3;then
命令3
else
命令4
fi
[b]case…in…esac条件选择 (比较灵活的方式)[/b]
case语句多用于较多分支判断
case格式: (多种模式,只匹配和variable相等的模式)
case variable in
模式1)命令1…;;
模式2)命令2…;;
esac
匹配模式
* 匹配任意字符
? 匹配任意单字符
[] 匹配字符范围
[b]case…in.esac实例1[/b]
[b] [/b]#!/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
[img]http://files.jb51.net/upload/201012/20101225174520749.png[/img]
[b]case…in.esac实例2[/b]
[b] [/b]题目是:学生的考试成绩是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
[b]解决今天的问题[/b]
使用if…else…fi的方式对输入的变量进行判断。
在每个判断的分支上执行相应的语句。
[b]menu.sh[/b]
#!/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
[img]http://files.jb51.net/upload/201012/20101225174520196.png[/img]
[img]http://files.jb51.net/upload/201012/20101225174520268.png[/img]
[img]http://files.jb51.net/upload/201012/20101225174521234.png[/img]
[img]http://files.jb51.net/upload/201012/20101225174521443.png[/img]
[b]本节课回顾:[/b]
[b] 条件测试的类型[/b]
文件测试
文本测试
数值测试
逻辑测试
[b]if…else…fi条件选择结构[/b]
[b] case…in…esac[/b]
课后测试
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
[img]http://files.jb51.net/upload/201012/20101225174521269.png[/img]
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感觉简单很多,呵呵,看个人喜好吧。
每天看来看一节教程就足够了。 看多了头也会晕的。 呵呵。 继续学习吧~