1.条件测试操作
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ] #前后有空格
文件测试
[ 操作符 文件或目录 ]
常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)
举例:
[root@server media]# [ -d /media ] #存在这个文件夹
[root@server media]# echo $?
0
[root@server ~]# [ -d /media/cdrom ] #不存在这个文件夹
[root@server ~]# echo $?
1
[root@server ~]# [ -d /media ] && echo "abc" #前面为真,则输出
abc
[root@server ~]# [ -d /media/cdrom ] || echo "abc" #或者的意思,不管是否成立,都会输出
abc
[root@server ~]# echo $[!0]
1
整数值比较
整数值比较
[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
常用的测试操作符
[root@server ~]# cat /etc/passwd | wc -l
44
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 100 ] && echo "more than 100"
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 10 ] && echo "more than 10"
more than 10
[root@server ~]# free -m
total used free shared buff/cache available
Mem: 1823 294 1100 9 428 1322
Swap: 2047 0 2047
[root@server ~]# freecc=$(free -m | grep "Mem:" | awk '{print $6}')
[root@server ~]# [ $freecc -lt 1024 ] && echo "$freecc"MB
428MB
[root@server ~]# cat /etc/passwd | wc -l
44
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 100 ] && echo "more than 100"
[root@server ~]# [ $(cat /etc/passwd | wc -l) -gt 10 ] && echo "more than 10"
more than 10
字符串比较
字符串比较
格式1:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,!号表示相反的意思
-z:字符串内容为空
[root@server ~]# echo $LANG
zh_CN.UTF-8
[root@server ~]# [ $LANG != "en.US" ] && echo "not en.US"
not en.US
[root@server ~]# read -p "是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes
[root@server ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
逻辑测试
逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
[root@server ~]# [ -d /etc ] && [ -r /etc ] && echo "You can"
You can
[root@server ~]# [ -d /etc ] || [ -d /home ] && echo "ok"
ok
2.if语句的结构
1.单分支结构
语句应用实例
单分支if语句
判断挂载点目录,若不存在则自动创建
[root@server ~]# cat chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom"
if [ ! -d $MOUNT_DIR ] #当目录不存在时执行
then mkdir -p $MOUNT_DIR
fi
[root@server ~]# vim weather.sh
if [ $weather = 'rainning' ]
then echo "下雨了,记得打伞"
fi
[root@server ~]# read -p "今天天气怎么样" weather
今天天气怎么样rainning
[root@server ~]# export weather
[root@server ~]# sh weather.sh
下雨了,记得打伞
2.双分支语句
语句应用实例
双分支if语句
[root@server ~]# cat pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then echo "host $1 is up"
else echo "host $1 is down"
fi
说明:"-c""-i""-W"选项,分别指定只发送三个测试包、间隔0.2秒、超时3秒
判断ping命令的检查结果,分别给出不同的提示
[root@server ~]# sh pinghost.sh 192.168.100.11
host 192.168.100.11 is up
[root@server ~]# sh pinghost.sh 192.168.100.12
host 192.168.100.12 is down
实例2
[root@server ~]# cat weather.sh
if [ $weather = 'rainning' ]
then echo "下雨了,记得打伞"
else echo "好天气"
fi
[root@server ~]# read -p "今天天气怎样?" weather
今天天气怎样?cloud
[root@server ~]# sh weather.sh
好天气
[root@server ~]# read -p "今天天气怎样?" weather
今天天气怎样?rainning
[root@server ~]# sh weather.sh
下雨了,记得打伞
pgrep -x 服务和ps aux | grep 服务的区别:
pgrep -x 某服务名称,只获取该服务进程号
[root@server ~]# pgrep -x sshd
1146
99426
ps aux | grep 服务是查询该服务所有的相关信息,包含端口
[root@server ~]# ps aux | grep sshd
root 1146 0.0 0.0 105996 440 ? Ss 13:21 0:00 /usr/sbin/sshd -D
root 99426 0.0 0.1 147784 5360 ? Ss 18:05 0:00 sshd: root@pts/0
root 100418 0.0 0.0 112680 984 pts/0 S+ 19:12 0:00 grep --color=auto sshd
3.多分支结构
语句应用实例
[root@server ~]# cat chengji.sh
#!/bin/bash
# get student's grade
read -p "输入考试成绩,范围0-100:" grade
if [ $grade -ge 90 ] && [ $grade -le 100 ]
then echo "你得了$grade分,优秀"
elif [ $grade -ge 80 ] && [ $grade -lt 90 ]
then echo "你得了$grade分,良好"
elif [ $grade -ge 60 ] && [ $grade -lt 80 ]
then echo "你得了$grade分,及格"
elif [ $grade -ge 0 ] && [ $grade -lt 60 ]
then echo "你得了$grade分,不及格"
else
echo "输入错误,请重新输入"
fi
[root@server ~]# sh chengji.sh
输入考试成绩,范围0-100:80
你得了80分,良好
4.case多分支语句
case多分支语句
[root@server ~]# cat hitkey.sh
#!/bin/bash
read -p "请输入一个字符,并按enter键确认:" key
case "$key" in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "你输入的是空格、功能键或其他控制字符"
esac
[root@server ~]# sh hitkey.sh
请输入一个字符,并按enter键确认:j
你输入的是字母
示例2
编写一个名为myprog的系统服务脚本,通过位置变量$1指定的start、stop、restart、status控制参数,分别用来启动、停止、重启、sleep进程的状态。其中sleep用来暂停指定秒数的时间,这里仅用做测试,在实际中应将sleep改为相应后台服务的控制命令序列
[root@server ~]# cat myprog
#!/bin/bash
case "$1" in
start)
echo -n "正在启动服务..."
if sleep 7200 &
then
echo "OK"
fi
;;
stop)
echo -n "正则停止sleep服务..."
pkill "sleep" &> /dev/null
echo "OK"
;;
status)
if pgrep "sleep" &> /dev/null
then echo "sleep服务已经启动"
else echo "sleep服务已经停止"
fi
;;
restart)
$0 stop
$0 start
;;
*)
echo "用法:$0 {start|stop|status|restart}"
esac
[root@server ~]# sh myprog start
正在启动服务...OK