一、判断
1、条件测试类型
整数测试
字符测试
文件测试
2、条件测试的表达式
[ 条件表达式 ]
[[ 条件表达式 ]]
test 条件表达式
例子:
1 2 3 4 5 6 7 8 9 10 11 12
| [root@node1 ~] false [root@node1 ~] [root@node1 ~] true [root@node1 ~] true [root@node1 ~] true [root@node1 ~] false
|
3、整数测试
-eq //测试两个整数是否相等
-ne //测试两个整数是否不等
-gt //测试一个数是否大于另一个数
-lt //测试一个数是否小于另一个数
-ge //大于或等于
-le //小于或等于
0–标准输入 1–标准输出 2—错误输出
/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,
所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,
也不会有任何信息输出到文件中
示例:
1 2 3 4 5 6 7 8 9 10 11
| [root@node1 ~]
a=10 b=8 [ $a -eq $b ] echo $?
[root@node1 ~] [root@node1 ~] 1
|
案例:
判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于
第一种:传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| [root@node1 ~]
[ $ 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 ~] [root@node1 ~] 必须输入两个参数 [root@node1 ~] 输入的参数必须是整数 [root@node1 ~] 11大于10 [root@node1 ~] 6等于6 [root@node1 ~] 4小于7
|
第二种:
通过read
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| [root@node1 ~]
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 ~] [root@node1 ~] 请输入要比较的两个参数:3 4 3小于4 [root@node1 ~] 请输入要比较的两个参数:5 5 5等于5 [root@node1 ~] 请输入要比较的两个参数:7 5 7大于5
|
第三种:使用if判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| [root@node1 ~]
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 human!' exit 2 }
[root@node1 ~] [root@node1 ~] 打印菜单,按照选择项选择你喜欢的帅哥 1.吴彦祖 2.华晨宇 3.彭于晏 please input the num you like: 3 I guess you like 彭于晏!
|
4、字符测试
== //等值比较,检查==两边的内容是否一致,==两边都要有空格
!= //检查两边内容是否不一致,不一致为真,一致为假
-z “string” //测试指定字符串是否为空,空则为真,不空则为假
-n “string” //测试指定字符串是否不空,不空则为真,空则为假
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 错误示范 test "$a"="$b"
[root@node1 ~] [root@node1 ~]
a="run" b="time" test "$a" = "$b" echo $?
[root@node1 ~] 1
[root@node1 ~] [root@node1 ~]
a="run" b="time" test -z "$a" echo $?
[root@node1 ~] 1
|
5、文件测试
存在性测试:
-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 //测试文件是否存在并且默认组是否为当前用户组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| [root@node1 ~] [root@node1 ~] [root@node1 ~] [root@node1 ~] [root@node1 ~] [root@node1 ~] [root@node1 ~]
[root@node1 ~] [root@node1 ~]
a=/tmp/file1 b=/tmp/file2 c=/tmp/test1 d=/tmp/test2 e=/tmp/test3 f=/tmp/file4 [ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在" [ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在" [ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件" [ -d $c ]&&echo "test1这是一个目录"||echo "test1不是一个目录" [ -L $d ]&&echo "test2这是一个链接文件"||echo "test2不是一个链接文件" [ -g $e ]&&echo "test3这个具有SGID权限"||echo "test3不具有SGID权限"
[root@node1 ~] file1文件已存在 file4文件不存在 file2这是一个普通文件 test1这是一个目录 test2不是一个链接文件 test3这个具有SGID权限
|
6、组合测试
-a //与关系 &&
-o //或关系 ||
! //非关系 !=
1 2 3 4 5 6 7 8 9 10 11 12 13
| [ $ [ $
[ 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 ]
[root@node1 ~] false [root@node1 ~] true
|
六、if语句
1、单分支if语句
语法:
if 条件;then
执行的命令
fi
案例:
判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!“
1 2 3 4 5 6 7 8 9 10 11
| [root@node1 ~] [sq@node1 ~]$ vim aa.sh
if [ $USER != "root" ];then echo "ERROR: need to be root so that!" fi
[sq@node1 ~]$ chmod +x aa.sh [sq@node1 ~]$ bash aa.sh ERROR: need to be root so that!
|
2、双分支if
双分支if语法:
if 条件;then
执行的命令1
else
执行的命令2
fi
案例:
判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如
果是普通用户输出”hey guest“
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [root@node1 ~] Last login: Thu Sep 5 21:24:00 CST 2024 on pts/0 [sq@node1 ~]$ vim ll.sh
if [ $USER = "root" ];then echo "hey admin" else echo "hey guest" fi [sq@node1 ~]$ ls aa.sh ll.sh [sq@node1 ~]$ chmod +x ll.sh [sq@node1 ~]$ bash ll.sh hey guest [sq@node1 ~]$ exit logout [root@node1 ~] hey admin
|
多分支if语法:
if 条件1;then
执行命令1
elif 条件2;then
执行命令2
elif 条件3;then
执行命令3
else
执行命令3
fi
前面案例使用if判断做 ( 判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| [root@node1 ~]
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 ~] [root@node1 ~] 请输入要比较的两个参数:10 20 10小于20
|