当前位置: 首页 > news >正文

shell判断、if语句

一、判断

1、条件测试类型

整数测试
字符测试
文件测试

2、条件测试的表达式

[ 条件表达式 ]
[[ 条件表达式 ]]
test 条件表达式

例子:

[root@node1 ~]# test -e file && echo true || echo false
false
[root@node1 ~]# touch file
[root@node1 ~]# test -e file && echo true || echo false
true
[root@node1 ~]# [ -e file ] && echo true || echo false
true
[root@node1 ~]# [[ -e file ]] && echo true || echo false
true
[root@node1 ~]# [[ -e file1 ]] && echo true || echo false
false

3、整数测试

-eq //测试两个整数是否相等
-ne //测试两个整数是否不等
-gt //测试一个数是否大于另一个数
-lt //测试一个数是否小于另一个数
-ge //大于或等于
-le //小于或等于

0–标准输入 1–标准输出 2—错误输出

/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,
所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。执行了这条命令之后,该条shell命令将不会输出任何信息到控制台,
也不会有任何信息输出到文件中

示例:

[root@node1 ~]# vim ab.sh
#!/bin/bash
a=10
b=8
[ $a -eq $b ]
echo $?[root@node1 ~]# chmod +x ab.sh 
[root@node1 ~]# ./ab.sh 
1

案例:

判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于

第一种:传递参数
[root@node1 ~]# vim abc.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 abc.sh 
[root@node1 ~]# ./abc.sh 
必须输入两个参数
[root@node1 ~]# ./abc.sh 1.5 10
输入的参数必须是整数
[root@node1 ~]# ./abc.sh 11 10
11大于10
[root@node1 ~]# ./abc.sh 6 6
6等于6
[root@node1 ~]# ./abc.sh 4 7
4小于7
第二种:

通过read

[root@node1 ~]# vim erd.sh
#!/bin/bash
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 erd.sh 
[root@node1 ~]# ./erd.sh 
请输入要比较的两个参数:3 4
3小于4
[root@node1 ~]# ./erd.sh 
请输入要比较的两个参数:5 5
5等于5
[root@node1 ~]# ./erd.sh 
请输入要比较的两个参数:7 5
7大于5
第三种:使用if判断
[root@node1 ~]# vim rty.sh
#!/bin/bash
echo "打印菜单,按照选择项选择你喜欢的帅哥"
cat <<EOF1.吴彦祖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 ~]# chmod +x rty.sh 
[root@node1 ~]# ./rty.sh 
打印菜单,按照选择项选择你喜欢的帅哥1.吴彦祖2.华晨宇3.彭于晏
please input the num you like: 3
I guess you like 彭于晏!

4、字符测试

== //等值比较,检查==两边的内容是否一致,==两边都要有空格
!= //检查两边内容是否不一致,不一致为真,一致为假
-z “string” //测试指定字符串是否为空,空则为真,不空则为假
-n “string” //测试指定字符串是否不空,不空则为真,空则为假

错误示范
test "$a"="$b"[root@node1 ~]# vim test.sh
[root@node1 ~]# chmod +x test.sh 
#!/bin/bash
a="run"
b="time"
test "$a" = "$b"
echo $?[root@node1 ~]# ./test.sh 
1[root@node1 ~]# vim test1.sh
[root@node1 ~]# chmod +x test1.sh 
#!/bin/bash
a="run"
b="time"
test  -z "$a"
echo $?[root@node1 ~]# ./test1.sh 
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      //测试文件是否存在并且默认组是否为当前用户组
[root@node1 ~]# touch /tmp/file
[root@node1 ~]# touch /tmp/file1
[root@node1 ~]# touch /tmp/file2
[root@node1 ~]# mkdir /tmp/test1
[root@node1 ~]# mkdir /tmp/test2
[root@node1 ~]# mkdir /tmp/test3
[root@node1 ~]# chmod g+s /tmp/test3[root@node1 ~]# vim ll.sh
[root@node1 ~]# chmod +x ll.sh 
#!/bin/bash
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 ~]# ./ll.sh 
file1文件已存在
file4文件不存在
file2这是一个普通文件
test1这是一个目录
test2不是一个链接文件
test3这个具有SGID权限

6、组合测试

-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 ] [root@node1 ~]#  [ 1 -eq 0 ] && echo true || echo false
false
[root@node1 ~]# [ 1 -eq 1 ] && echo true || echo false
true

六、if语句

1、单分支if语句

语法:
if 条件;then
执行的命令
fi

案例:
判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!“

[root@node1 ~]# su - sq 
[sq@node1 ~]$ vim aa.sh
#!/bin/bash
if [ $USER != "root" ];thenecho "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“

[root@node1 ~]# su - sq 
Last login: Thu Sep  5 21:24:00 CST 2024 on pts/0
[sq@node1 ~]$ vim ll.sh
#!/bin/bash
if [ $USER = "root" ];thenecho "hey admin"
elseecho "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 ~]# bash /home/sq/ll.sh 
hey admin

多分支if语法:

if 条件1;then
执行命令1
elif 条件2;then
执行命令2
elif 条件3;then
执行命令3
else
执行命令3
fi

前面案例使用if判断做 ( 判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于)

[root@node1 ~]# vim ww.sh
#!/bin/bash
read -p '请输入要比较的两个参数:' n m
expr $n + $m >/dev/null 2>&1
[ $? -ne 0 ]&&{echo '输入的参数必须是整数'exit
}
if [ $n -gt $m ];thenecho "$n大于$m"elif [ $n -eq $m ];thenecho "$n等于$m"
elseecho "$n小于$m"
fi[root@node1 ~]# chmod +x ww.sh 
[root@node1 ~]# ./ww.sh 
请输入要比较的两个参数:10 20
10小于20

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 探索C++编程技巧:计算两个字符串的最长公共子串
  • 内网Exadata使用git的配置过程
  • 一、VSCode安装IDF5.3
  • 数据结构---->内核链表
  • 解决:使用Charles查看本机的ip地址
  • 数学建模常见模型(下)
  • 【HTTP、Web常用协议等等】前端八股文面试题
  • 【 WPF 中常用的Brush类的简要介绍、使用方法和适用场景】
  • 微服务面试题
  • 安卓逆向(之)真机root(红米手机)
  • 什么是Java中的模板方法模式?请给出示例。Java中的设计模式有哪些?请列举几个并解释其应用场景。
  • .net core 管理用户机密
  • 加密技术.
  • 编程式路由跳转
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Cumulo 的 ClojureScript 模块已经成型
  • Date型的使用
  • ES6核心特性
  • go append函数以及写入
  • HTTP 简介
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java应用性能调优
  • nodejs:开发并发布一个nodejs包
  • PHP 的 SAPI 是个什么东西
  • SpiderData 2019年2月23日 DApp数据排行榜
  • ViewService——一种保证客户端与服务端同步的方法
  • VUE es6技巧写法(持续更新中~~~)
  • vue-cli3搭建项目
  • windows-nginx-https-本地配置
  • 订阅Forge Viewer所有的事件
  • 对象引论
  • 分类模型——Logistics Regression
  • 关于使用markdown的方法(引自CSDN教程)
  • 软件开发学习的5大技巧,你知道吗?
  • 数组的操作
  • 微服务框架lagom
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #{}和${}的区别?
  • #07【面试问题整理】嵌入式软件工程师
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (11)MATLAB PCA+SVM 人脸识别
  • (19)夹钳(用于送货)
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)共用体union的用法举例
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (五)c52学习之旅-静态数码管
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .net Application的目录