条件表达式

文件测试

一般使用[ ]表示,也可以使用test,结果为真则$?返回0,man test可以查看所有的表达式

[root@home ~]# [ -f test.sh ]
[root@home ~]# echo $?
0
[root@home ~]# [ -d test.sh ]
[root@home ~]# echo $?
1
[root@home ~]# test -f test.sh
[root@home ~]# echo $?
0
[root@home ~]# test -d test.sh
[root@home ~]# echo $?
1
  • -e : 存在则为真
  • -f : 是否为文件
  • -d : 是否为目录是否存在
  • -x : 是否可执行
  • -r : 是否可读
  • -w : 是否可写

更多测试和应用

[root@home ~]# [ -f /etc/hostssss ] && echo ok || echo error
error
[root@home ~]# [ -d /etc/ ] && echo ok || echo error
ok
#可以通过判断目录是否存在来创建目录
[root@home ~]# [ -d /backup/1997sty ] && echo ok || mkdir -p /backup/1997sty
[root@home ~]# [ -d /backup/1997sty ] && echo ok || mkdir -p /backup/1997sty
ok
[root@home ~]# tree /backup/
/backup/
└── 1997sty

1 directory, 0 files
[root@home ~]# [ -d /backup ] && action "Nginx start is" /bin/true || action "Nginx start is" /bin/false
-bash: action: 未找到命令
[root@home ~]# . /etc/init.d/functions
[root@home ~]# [ -d /backup ] && action "Nginx start is" /bin/true || action "Nginx start is" /bin/false
Nginx start is [失败]
#/etc/init.d/functions是函数库判断该文件是否存在来加载该文件
[root@home ~]# [ -f /etc/init.d/functions ] && . /etc/init.d/functions
[root@home ~]# [ -f /etc/init.d/functions ]
[root@home ~]# echo $?
0

数值比较

语法格式 [ 1 -eq 1 ]

如果使用[[]],建议使用==,<,>,<=,>=,!=

  • -eq : 等于
  • -ne : 不等于
  • -gt : 大于
  • -ge : 大于等于
  • -lt : 小于
  • -le : 小于等于

使用示范

[root@home ~]# [ 10 -eq 20 ] && echo $? || echo $?
1
[root@home ~]# [ 10 -lt 20 ] && echo $? || echo $?
0
[root@home ~]# [ 10 -le 10 ] && echo $? || echo $?
0
[root@home ~]# [ 10 -ne 10 ] && echo $? || echo $?
1
[root@home ~]# [ 10 -ge 10 ] && echo $? || echo $?
0
[root@home ~]# [ 10 -gt 10 ] && echo $? || echo $?
1
  • 题:统计磁盘使用率如果磁盘大于5%则提示报警小于则提示ok
  1. 取出磁盘当前使用率
  2. 用数值表达式判断大小
  3. 给出提示
#!/bin/sh

#获得根目录的磁盘使用率
disk=`df -h|grep '/$'|awk '{print $(NF-1)}'`
#判断用数值表达式判断大小
[ ${disk%\%} -gt 1 ] && echo warning || echo ok

多整数比较

  • -a : 与
  • -o : 或

如果使用[[]],则使用||,&&

[root@home ~]# [ 10 -eq 10 -a 10 -gt 100 ]
[root@home ~]# echo $?
1
[root@home ~]# [ 10 -eq 10 -a 10 -lt 100 ]
[root@home ~]# echo $?
0
[root@home ~]# [ 10 -eq 10 -o 10 -lt 100 ]
[root@home ~]# echo $?
0
[root@home ~]# [ 10 -eq 10 -o 10 -lt 100 ]
[root@home ~]# echo $?
0
[root@home ~]# [[ 10 -eq 10 || 10 -lt 100 ]]
[root@home ~]# echo $?
0
[root@home ~]# [[ 10 -eq 10 && 10 -lt 100 ]]
[root@home ~]# echo $?
0

字符串比较

字符串需要加引号来进行比较

[root@home ~]# [ "$USER" = "root" ]
[root@home ~]# echo $?
0
[root@home ~]# [ $USER = "root" ]
[root@home ~]# echo $?
0
[root@home ~]# [ $USER = 'root' ]
[root@home ~]# echo $?
0

补充:如何查看变量

#查看当前系统变量
env
set
  • -z : 字符串长度为0为真
  • -n : 字符串长度不为0为真

使用示范,可以用该参数判断输入是否为空

[root@home ~]# AAA=""
[root@home ~]# echo $AAA

[root@home ~]# [ -z $AAA ]
[root@home ~]# echo $?
0
[root@home ~]# AAA="qqqq"
[root@home ~]# [ -z $AAA ]
[root@home ~]# echo $?
1
[root@home ~]# [ -n $AAA ]
[root@home ~]# echo $?
0

正则字符串比较和取反

与普通字符串比较的区别在于使用的符号为=~,对一个结果取反只需要在最左侧加上!符号

[root@home ~]# echo $USER
root
[root@home ~]# [[ $USER =~ ^r ]]
[root@home ~]# echo $?
0
[root@home ~]# [[ $USER =~ ^1 ]]
[root@home ~]# echo $?
1
[root@home ~]# [[ ! $USER =~ ^1 ]]
[root@home ~]# echo $?
0
#也可以用来判断整数
[root@home ~]# [[ '123154' =~ ^[0-9]+$ ]]
[root@home ~]# echo $?
0
[root@home ~]# [[ 'a123154' =~ ^[0-9]+$ ]]
[root@home ~]# echo $?
1

补充部分

  • 笔试题:Linux默认路由设置
route add default gw 10.0.0.254
route del default gw 10.0.0.254
ip route add 0/0 via 10.0.0.254
ip route del 0/0 via 10.0.0.254
  • 网卡添加多个IP地址
#添加单个
ip addr add 10.0.0.100/24 dev eth0
#循环添加多个
for i in {10. .200};do ip addr add 10.0.0.$i/24 dev eth0;done
  • 策略路由
#查看策略路由
ip ro list
#路由表
cat /etc/iproute2/rt_tables