shell概述
在简单的shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程。
但是,单一的顺序结构使得脚本过于机械化,不够“智能”,难以处理更加领过的系统任务。
测试命令
测试表达是否成立,成立返回0,其他表示不成立
有两种方法
1、test 条件表达
2、[ 条件表达 ]
文件测试
d 测试是否为目录
-e 测试目录或文件是否存在
-f 测试是不是文件
-w 测试当前用户是否有权写入
-r 测试当前用户是否有权读取
-x 测试当前用户是否有权执行
[root@localhost /]# [ -d mulu ]
[root@localhost /]# echo $?
0
[root@localhost /]# test -d /mulu
[root@localhost /]# echo $?
0
[root@localhost /]# test -f /mulu
[root@localhost /]# echo $?
1
[root@localhost /]# [ -f mulu ]
[root@localhost /]# echo $?
1
数值比较
[ 整数1 操作 整数2 ]
常用的测试操作符
-eq 等于 Equal
-ne 不等于 Not Equal
-gt 大于 Greater Than
-lt 小雨 Leasser Than
-le 小于或等于 lesser or qual
-ge 大于或等于 greater or equal
注:仅能比较数值,若要比较字符,可以使用 “ == ”符号
数值比较
[root@localhost mulu]# FREE=$(free -m | grep Mem |awk '{print $4}')
[root@localhost mulu]# echo "$FREE"MB
2159MB
[root@localhost mulu]# vim neicun.sh
#!/bin/bash
FREE=$(free -m |grep "Mem" |awk '{print $4}')
#echo $FREE //测试用
if [ $FREE -ge 1000 ]
then
echo "内存够大,你还剩"$FREE"MB"
else
echo "内存不够了"
fi
[root@localhost mulu]# source neicun.sh
内存够大,你还剩2151MB
字符串比较
[ 字符串1 符号 字符串2 ]
常用符号: = 字符串内容是否相同
!= 字符串内容不同,!表示取反
[root@localhost mulu]# [ 123 = 123 ]&&echo "相同"
相同
常用测试操作
[root@localhost mulu]# [ $LANG != "en.US" ] && echo "no"
no
逻辑测试
-a 或 && 逻辑与,而且 的意思
-o 或 || 逻辑或, 或者 的意思
! 逻辑否
[root@localhost mulu]# [ -d /mulu ] && [ -e /mulu ] &&echo "成立"
成立
[root@localhost mulu]# [ -f /mulu ]||[ -d /mulu ]&&echo "成立"
成立
IF语句
单分支结构
if 条件
then 命令
fi 结尾
[root@localhost mulu]# vi dxh.sh
#!/bin/bash
read -p "请输入一个十以内的正整数" zhengshu
if [ $zhengshu -lt 10 ]
then
echo "你输入的是$zhengshu"
fi
[root@localhost mulu]# source dxh.sh
请输入一个十以内的正整数5
你输入的是5
双分支结构
if条件
then 命令
else 密令序列
fi
[root@localhost mulu]# vim sfz.sh
#!/bin/bash
read -p "请输入一个正整数" zzs
yushu=`expr $zzs % 2`
if [ $yushu -eq 0 ]
then
echo "你输入的是双数"
else
echo "你输入的是单数"
fi
[root@localhost mulu]# source sfz.sh
请输入一个正整数5
你输入的是单数
[root@localhost mulu]# source sfz.sh
请输入一个正整数6
你输入的是双数
多分支结构
[root@localhost mulu]# vim dfz.sh
#!/bin/bash
read -p "请输入你的成绩" cj
if [ $cj -ge 90 ]&&[ $cj -le 100 ]
then
echo "你的成绩优秀"
elif [ $cj -lt 90 ]&&[ $cj -ge 70 ]
then
echo "你的成绩良好"
elif [ $cj -lt 70 ]&&[ $cj -ge 60 ]
then
echo "你的成绩及格"
elif [ $cj -lt 60 ]&&[ $cj -ge 0 ]
then
echo "你成绩……继续努力"
else
echo "请端正你的态度"
fi
[root@localhost mulu]# source dfz.sh
请输入你的成绩90
你的成绩优秀
[root@localhost mulu]# source dfz.sh
请输入你的成绩80
你的成绩良好
[root@localhost mulu]# source dfz.sh
请输入你的成绩60
你的成绩及格
[root@localhost mulu]# source dfz.sh
请输入你的成绩40
你成绩……继续努力
[root@localhost mulu]# source dfz.sh
请输入你的成绩110
请端正你的态度
CASE多分支
[root@localhost mulu]# vim pb.sh
#!/bin/bash
read -p "你的跑步时间:" sj
case "$sj" in
[0-9]|10)
echo "恭喜"
read -p "你的性别:" se
case "$se" in
nan)
echo "男子组决赛"
;;
nv)
echo "女子组决赛"
;;
*)
echo "请正视你的性别"
esac
;;
*)
echo "出局"
esac
[root@localhost mulu]# source pb.sh
你的跑步时间:8
恭喜
你的性别:nan
男子组决赛
[root@localhost mulu]# source pb.sh
你的跑步时间:9
恭喜
你的性别:nv
女子组决赛
[root@localhost mulu]# source pb.sh
你的跑步时间:12
出局