目录
一.文件测试
- test命令测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
- 常用的测试操作符
- -d:测试是否为目录(directory)
- -f:测试是否为文件(file)
- -e:测试目录或者文件是否存在(exist)
- -r:测试当前用户是否由权限读取(read)
- -w:测试当前用户是否由权限写入(write)
- -x:测试当前用户是否有权限执行(excute)
- 文件测试的两种书写方式:test 操作符 文件或目录 ;[ 操作符 文件或目录 ]
- 实例如下所示
[root@localhost ~]# test -d /mnt
[root@localhost ~]# echo $? //$?上一行命令执行后返回的状态
0 //当返回状态值为0时,表示执行正常,非0值表示执行异常或出错
[root@localhost ~]# test -f /mnt
[root@localhost ~]# echo $?
1
[root@localhost ~]#
[root@localhost ~]# [ -f /mnt ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /mnt ]
[root@localhost ~]# echo $?
0
[root@localhost ~]#
- &&逻辑与,||逻辑或,!取反,示例如下:
[root@localhost ~]# [ -d /mnt ] && echo "yes"
yes
[root@localhost ~]# [ -f /mnt ] && echo "yes" //逻辑与必须两个都正确才能执行
[root@localhost ~]# [ -f /mnt ] || echo "yes" //逻辑或两个条件满足一个即可执行
yes
[root@localhost ~]# [ ! -f /mnt ] && echo "yes" //取反,使得原来的结果与现在完全相反
yes
[root@localhost ~]#
二.数值比较
- 常用的测试操作符
- -eq:等于(equal)
- -ne:不等于(not equal)
- -gt:大于(greater than)
- -lt:小于(lesser or equal)
- -le:小于或等于(lesser or equal)
- -ge:大于或等于(greater or equal)
- 整数值之间的比较:[ 整数1 操作符 整数2 ],示例如下
[root@localhost ~]# [ `ps aux | wc -l` -gt 100 ] && echo "进程过多"
进程过多
[root@localhost ~]# [ $(ps aux | wc -l) -gt 100 ] && echo "进程过多"
进程过多
[root@localhost ~]# ps aux | wc -l //统计进程数量
146
[root@localhost ~]# free -m //查看物理内存和虚拟内存
total used free shared buff/cache available
Mem: 976 295 295 7 385 476
Swap: 4095 0 4095
[root@localhost ~]# [ $(free -m | grep "Mem" | awk '{print $4}') -gt 100 ] && echo "有空闲内存"
有空闲内存
//上述命令是,筛选物理内存的第四列的free空间,再看是否比100大,如果比100大,则输出有空闲内存
三.字符串比较
- 常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同
- -z:字符串内容为空
- 使用格式:[ 字符串1 = 字符串2 ] ;[ 字符串1 = 字符串2 ];[ -z 字符串 ] ,实例如下:
[root@localhost ~]# echo $LANG //LANG查看字符使用模式
zh_CN.UTF-8
[root@localhost ~]# [ $LANG = zh_CN.UTF-8 ] && echo "字符正确"
字符正确
[root@localhost ~]# [ $LANG != zh_CN.UTF-8 ] && echo "字符正确"
[root@localhost ~]#
- 使用脚本创建目录,如下所示
[root@localhost mnt]# vim a.sh
#!/bin/bash
read -p "是否创建目录yes/no:" ack //写入yes或no
[ -d /mnt/share ] && echo "已经创建" //判断是否存在/mnt/share目录
[ $ack = "yes" ] && mkdir /mnt/share | echo "创建成功" //创建/mnt/share目录
[root@localhost mnt]# sh a.sh //执行脚本
是否创建目录yes/no:yes
创建成功
[root@localhost mnt]# ls
a.sh share
[root@localhost mnt]# vim a.sh
[root@localhost mnt]# sh a.sh
是否创建目录yes/no:yes
已经创建
创建成功
mkdir: 无法创建目录"/mnt/share": 文件已存在
- 运算符“i++”与“++i”,let命令
[root@localhost mnt]# i=1
[root@localhost mnt]# let i=i++
[root@localhost mnt]# echo $i
1
[root@localhost mnt]# i=1
[root@localhost mnt]# let i=++i
[root@localhost mnt]# echo $i
2
//i=i++,是先赋值,再计算
//i=++i,是先计算,再赋值
四.逻辑测试
- 常用的测试操作符
- -a或&&:逻辑与,而且
- -o或||:逻辑或,或者
- !:逻辑否
- 使用格式为:[ 表达式1 ] 操作符 [ 表达式2 ];命令1 操作符 命令2 ,示例如下
[root@localhost mnt]# [ -d /etc ] && [ -r /etc ] && echo "you can open it"
you can open it
[root@localhost mnt]# [ -d /etc ] || [ -d /opt ] && echo "ok"
ok
[root@localhost mnt]#
五.if语句的结构与实例
- 单分支结构
if 条件测试操作
then
命令序列
fi
- 双分支结构
if 条件测试操作
then
命令序列1
else
命令序列2
fi
- 多分支结构
if 条件测试操作
then
命令序列1
elif 条件测试操作
then
命令序列2
else
命令序列3
fi
- 多分支嵌套结构
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
elif 条件测试操作3
then
命令序列3
else
if 条件测试操作4
then
命令序列4
else
命令序列5
fi
fi
- 编写简单计算器shell脚本
[root@localhost opt]# vim e.sh
#设置闪烁特效
echo -e "\033[5;46;30m-------------------------------\033[0m"
echo " 简单计算器 "
echo -e "\033[5;46;30m-------------------------------\033[0m"
#输入数据
read -p "输入第一个整数:" number1
#选择运算符
read -p "选择运算符 +(加法) , -(减法) , x(乘法) , /(除法) , % (取余) :" operator
read -p "输入第二个整数:" number2
#if语句的嵌套
if [ $operator == "+" ]
then
sum=`expr $number1 + $number2`
echo $sum
elif [ $operator == "-" ]
then
sum=`expr $number1 - $number2`
echo $sum
elif [ $operator == "x" ]
then
sum=`expr $number1 \* $number2`
echo $sum
elif [ $operator == "/" ]
then
sum=`expr $number1 / $number2`
echo $sum
elif [ $operator == "%" ]
then
sum=`expr $number1 % $number2`
echo $sum
else
echo "输入错误"
fi
[root@localhost opt]# sh e.sh
-------------------------------
简单计算器
-------------------------------
输入第一个整数:9
选择运算符 +(加法) , -(减法) , x(乘法) , /(除法) , % (取余) :%
输入第二个整数:2
1