条件测试类型
整数测试
字符测试
文件测试
条件测试的表达式
[ 条件表达式 ]
[[ 条件表达式 ]]
test 条件表达式
例
[root@node1 ~]# test -e file && echo true || echo false //测试是否又file这个文件 false [root@node1 ~]# touch file // 创建一个file文件 [root@node1 ~]# test -e file && echo true || echo false // 此时返回结果true true [root@node1 ~]# [ -e file ] && echo true || echo false true [root@node1 ~]# [[ -e file1 ]] && echo true || echo false false
整数测试
-eq //测试两个整数是否相等
-ne //测试两个整数是否不等
-gt //测试一个数是否大于另一个数
-lt //测试一个数是否小于另一个数
-ge //大于或等于
-le //小于或等于例
[root@node1 ~]# cat b.sh #!/bin/bash a=10 b=8 [ $a -eq $b ] echo $? [root@node1 ~]# ./b.sh 1
案例1
判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于[root@node1 ~]# cat c.sh #!/bin/bash [ $# -ne 2 ]&&{ echo '必须输入两个参数' exit } expr $1 + $2 >/dev/null 2>&1 [ $? -ne 0 ]&&{ echo '输入的参数必须是整数' exit } [ $1 -gt $2 ]&&{ echo "$1大于$2" } [ $1 -eq $2 ]&&{ echo "$1等于$2" } [ $1 -lt $2 ]&&{ echo "$1小于$2" }
测试
[root@node1 ~]# chmod +x c.sh // 设置执行权限 [root@node1 ~]# ./c.sh 10 20 10小于20 [root@node1 ~]# ./c.sh 30 10 30大于10 [root@node1 ~]# ./c.sh 30 30 30等于30 [root@node1 ~]# ./c.sh // 不输入参数时 必须输入两个参数 [root@node1 ~]# ./c.sh 5.5 4.5 // 输入的不是整数的时 输入的参数必须是整数
0--标准输入 1--标准输出 2---错误输出
>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,
所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,
也不会有任何信息输出到文件中
第二种写法
使用read 来编写脚本
[root@node1 ~]# cat d.sh read -p '请输入要比较的两个参数:' n m expr $n + $m >/dev/null 2>&1 [ $? -ne 0 ]&&{ echo '输入的参数必须是整数' exit } [ $n -gt $m ]&&{ echo "$n大于$m" } [ $n -eq $m ]&&{ echo "$n等于$m" } [ $n -lt $m ]&&{ echo "$n小于$m" } [root@node1 ~]# chmod +x d.sh [root@node1 ~]# ./d.sh 请输入要比较的两个参数:100 99 100大于99 [root@node1 ~]# ./d.sh 请输入要比较的两个参数:99 100 99小于100
案例2
#!/bin/bash
echo "打印菜单,按照选择项选择你喜欢的游戏"
cat <<EOF
1.王者荣耀
2.原神
3.和平精英
EOF
read -p "please input the num you like: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{
[ $num -eq 1 ]&&{
echo 'I guess you like 王者荣耀!'
exit 0
}
[ $num -eq 2 ]&&{
echo 'I guess you like 元神'
exit 0
}
[ $num -eq 3 ]&&{
echo 'I guess you like 和平精英!'
exit 0
}
}||{
echo 'I guess you are not geam!'
exit 2
}
/测试
[root@node1 ~]# ./e.sh
打印菜单,按照选择项选择你喜欢的游戏
1.王者荣耀
2.原神
3.和平精英
please input the num you like: 1
I guess you like 王者荣耀!
[root@node1 ~]# ./e.sh
打印菜单,按照选择项选择你喜欢的游戏
1.王者荣耀
2.原神
3.和平精英
please input the num you like: 2
I guess you like 元神
[root@node1 ~]# ./e.sh
打印菜单,按照选择项选择你喜欢的游戏
1.王者荣耀
2.原神
3.和平精英
please input the num you like: 4
I guess you are not geam!
字符测试
== //等值比较,检查==两边的内容是否一致,==两边都要有空格
!= //检查两边内容是否不一致,不一致为真,一致为假
-z "string" //测试指定字符串是否为空,空则为真,不空则为假
-n "string" //测试指定字符串是否不空,不空则为真,空则为假
文件测试
//存在性测试:
-e //测试文件是否存在
//存在性及类别测试:
-b //测试文件是否为块设备文件
-c //测试文件是否为字符设备文件
-f //测试文件是否为普通文件
-d //测试指定路径是否为目录
-L //测试文件是否为符号链接文件
-p //测试文件是否为命名管道文件
-S //测试文件是否为套接字文件
//文件权限测试:
-r //测试当前用户对指定文件是否有读权限
-w //测试当前用户对指定文件是否有写权限
-x //测试当前用户对指定文件是否有执行权限
//文件特殊权限测试:
-g //测试文件是否有sgid权限
-u //测试文件是否有suid权限
-k //测试文件是否有sticky权限
//文件大小测试:
-s //测试文件是否非空
//文件是否打开测试:
-t fd //fd表示的文件描述符是否已经打开且与某终端相关
//双目测试:
file1 -ef file2 //测试file1与file2是否指向同一个设备上的相同inode,说白点就是两者是不是同一个文件
file1 -nt file2 //测试file1是否比file2新
file1 -ot file2 //测试file1是否比file2旧
//无分类:
-N //测试文件自从上一次被读取之后是否被修改过
-O //测试文件是否存在并且被当前用户拥有
-G //测试文件是否存在并且默认组是否为当前用户组
测试
创建需要测试需要的文件目录
[root@node1 ~]# touch /tmp/file1
[root@node1 ~]# touch /tmp/file2
[root@node1 ~]# mkdir /tmp/dir1
[root@node1 ~]# ln -s /tmp/dir1 /tmp/dir2
[root@node1 ~]# mkdir /tmp/dir3
[root@node1 ~]# chmod g+s /tmp/dir3
// 编写脚本
[root@node1 ~]# vim cc.sh
[root@node1 ~]# cat cc.sh
#!/bin/bash
a=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4
[ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在"
[ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在"
[ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1这是一个目录"||echo "dir1不是一个目录"
[ -L $d ]&&echo "dir2这是一个链接文件"||echo "dir2不是一个链接文件"
[ -g $e ]&&echo "dir3这个具有SGID权限"||echo "dir3不具有SGID权限"
[root@node1 ~]# chmod +x cc.sh
[root@node1 ~]# ./cc.sh
file1文件已存在
file4文件不存在
file2这是一个普通文件
dir1这是一个目录
dir2这是一个链接文件
dir3这个具有SGID权限
组合测试
-a //与关系 &&
-o //或关系 ||
! //非关系 !=
[ $# -gt 1 -a $# -le 3 ] //两个都是大于1且小于等于3
[ $# -gt 1 ] && [ $# -le 3 ][ 1 -eq 1 -a 1 -ne 0 ]
[ 1 -eq 1 ] && [ 1 -ne 0 ]
[ 1 -eq 1 -o 1 -ne 1 ]
[ 1 -eq 1 ] || [ 1 -ne 1 ]
if语句
1、单分支if语句
语法:
if 条件;then
执行的命令
fi
案例
判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root
so that!“
此时是普通用户 [hy@node1 ~]$ ls [hy@node1 ~]$ vim ee.sh [hy@node1 ~]$ cat ee.sh #!/bin/bash if [ $USER != "root" ];then echo "ERROR: need to be root so that!" fi [hy@node1 ~]$ chmod +x ee.sh [hy@node1 ~]$ ./ee.sh ERROR: need to be root so that!
双分支if
双分支if语法:
if 条件;then
执行的命令1
else
执行的命令2
fi
案例判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如
果是普通用户输出”hey guest“
[root@node1 ~]# vim ff.sh [root@node1 ~]# cat ff.sh #!/bin/bash if [ $USER = "root" ];then echo "hey admin" else echo "hey guest" fi [root@node1 ~]# chmod +x ff.sh [root@node1 ~]# ./ff.sh hey admin
多分支if语法
if 条件1;then
执行命令1
elif 条件2;then
执行命令2
elif 条件3;then
执行命令3
else
执行命令3
fi
[root@node1 ~]# vim gg.sh [root@node1 ~]# cat gg.sh #!/bin/bash read -p '请输入要比较的两个参数:' n m expr $n + $m >/dev/null 2>&1 [ $? -ne 0 ]&&{ echo '输入的参数必须是整数' exit } if [ $n -gt $m ];then echo "$n大于$m" elif [ $n -eq $m ];then echo "$n等于$m" else echo "$n小于$m" fi [root@node1 ~]# ./gg.sh 请输入要比较的两个参数:10 15 10小于15 [root@node1 ~]# ./gg.sh 请输入要比较的两个参数:1.5 6 //错误输入 输入的参数必须是整数