Shell编程之条件语句
时间:2021-07-12
本文章向大家介绍Shell编程之条件语句,主要包括Shell编程之条件语句使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Shell编程之条件语句
目录
一、条件测试
1. 文件测试与整数测试
(1)test命令
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ]
注:格式2[]前后需留有至少一个空格
(2)文件测试
格式为:[ 操作符 文件或目录 ]
[root@localhost ~]# [ -d /etc/sysconfig ]
[root@localhost ~]# echo $? #返回0表示条件成立
0
[root@localhost ~]# [ -d /etc/sys ]
[root@localhost ~]# echo $? #返回1表示条件不成立
1
[root@localhost ~]# [ -d /etc/sysconfig ] && echo "YES" #逻辑与,“而且”的意思
YES
(3)常用的文件测试操作符
常用文件比较运算符 | 说明 | 示例 |
---|---|---|
-e filename | 如果filename存在,则为真 | [ -e /var/log/syslog ] |
-d filename | 如果filename目录存在,则为真 | [ -d /tmp/mydir ] |
-f filename | 如果filename文件存在,则为真 | [ -f /usr/bin/grep ] |
-L filename | 如果filename符号链接存在,则为真 | [ -L /usr/bin/grep ] |
-r filename | 如果filename可读,则为真 | [ -r /var/log/syslog ] |
-w filename | 如果filename可写,则为真 | [ -w /var/mytmp.txt ] |
-x filename | 如果filename可执行,则为真 | [ -L /usr/bin/grep ] |
filename1 -nt filename2 | 如果filename1比filename2新,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1 -ot filename2 | 如果filename1比filename2旧,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
(4)整数值比较
格式为:[ 整数1 操作符 整数2 ]
[root@localhost ~]# who | wc -l
1
[root@localhost ~]# [ $(who | wc -l) -lt 5 ] && echo "<5"
<5
[root@localhost ~]# FreeCC=$(free -m | grep "Mem:" | awk '{print $6}')
[root@localhost ~]# [ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
606MB
常用的测试操作符 | 说明 |
---|---|
-eq | 等于(equal) |
-ne | 不等于(not equal) |
-gt | 大于(greater than) |
-lt | 小于(lesser than) |
-le | 小于或等于(lesser or equal) |
-ge | 大于或等于(greater or equal) |
2. 字符串测试与逻辑测试
(1)字符串比较
格式1:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:
[ -z 字符串 ]
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
[root@localhost ~]# read -p "是否覆盖(yes/no)?" ACK
是否覆盖(yes/no)?yes
[root@localhost ~]# [ $ACK="yes" ] && echo "覆盖"
覆盖
(2)read命令
Linux read命令用于从标准输入读取数值。
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
read常用选项 | 说明 |
---|---|
-a | 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符 |
-d | 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标准 |
-p | 后面跟提示信息,即在输入前打印提示信息 |
-e | 在输入的时候可以使用命令补全功能 |
-n | 后跟一个数字,定义输入文本的长度,很实用 |
-r | 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话\就是个正常的字符了 |
-s | 安静模式,在输入字符时不在屏幕上显示,例如login时输入密码 |
-l | 后面跟秒数,定义输入字符的等待时间 |
-u | 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的 |
二、if语句
1. if语句概述
(1)逻辑测试
格式1:
[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:
命令1 操作符 命令2
(2)常用的测试操作符
常用操作符 | 说明 |
---|---|
-a或&& | 逻辑与,“而且”的意思 |
-o或|| | 逻辑或,“或者”的意思 |
! | 逻辑否 |
[root@localhost ~]# [ -d /etc ] && [ -r /etc ] && echo "you can open it"
you can open it
[root@localhost ~]# [ -d /etc ] || [ -d /home ] && echo "ok"
ok
2. if单分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列]
B -->C[fi结束判断]
A -->|条件不成立| C
D[单分支流程图]
if 条件测试操作
then 命令序列
fi
例如:
#!/bin/bash
read -p "请输入您的数据:" nums
if [ $[nums%2] == 0 ];then
echo "$nums是偶数"
fi
3. if双分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列1]
B -->D[fi结束判断]
A -->|条件不成立 else| C[命令序列2]
C -->D
E[双分支流程图]
if 条件测试操作
then 命令序列1
else 命令序列2
fi
例如:
#!/bin/bash
read -p "请输入您的数据:" nums
if [ $[nums%2] == 0 ];then
echo "$nums是偶数"
else
echo "$nums是奇数"
fi
4. if多分支语句
graph LR
A{if条件测试操作} -->|条件成立 then| B[命令序列1]
B -->F[fi结束判断]
A -->C{elif条件测试操作}
C -->|条件成立 then| D[命令序列2]
D -->F
C -->|条件不成立 else| E[命令序列n]
E -->F
G[双分支流程图]
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
例如:
#!/bin/bash
read -p "请输入您的成绩:" nums
if [ $nums -ge 90 ];then
echo "出去旅游"
elif [ $nums -ge 80 ];then
echo "买个玩具"
elif [ $nums -ge 70 ];then
echo "在家写作业"
elif [ $nums -ge 60 ];then
echo "试卷抄3遍"
else
echo "再报5个班"
fi
原文地址:https://www.cnblogs.com/dingcong1201/p/15001394.html
- 知其所以然之永不遗忘的算法
- ZOOKEEPER集群搭建及测试
- 【Python环境】Scikit-Learn:开源的机器学习Python模块
- 【Python环境】可爱的 Python: 自然语言工具包入门
- 电脑静音工作,又听不到12306的来票音乐,纠结啊 !但春节前工作多任务重,不能安心工作,就动手做个“无声购票弹窗”工具吧!
- .net访问PostgreSQL数据库发生“找不到函数名”的问题追踪
- “领域驱动开发”实例之旅(1)--不一样的开发模式 一、分析业务需求。 二、设计领域对象模型 三、测试领域对象模型 四、设计业务处理类 五、设计Entity和Vi
- Java基础——左移和右移
- 【Python环境】利用 Python、SciKit 和文本分类来实现行为分析
- LJMM平台( Linux +Jexus+MySQL+mono) 上使用MySQL的简单总结
- 判断两个单链表是否相交(有环、无环两种)
- 【数据科学家】SparkR:数据科学家的新利器
- KMP算法浅析
- Bug修复问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- iOS音视频接入 - TRTC接入实时视频通话
- LRU缓存淘汰机制C++实现
- ant-design-vue运行时动态切换主题色
- 使用electron将vue-cli3.x项目打包为桌面应用
- Ubuntu 16.04下安装服务器端Shadowsocks
- 解决vue cli3.x打包上线静态资源找不到路径问题
- Ant-design-vue+vue-i18n实现前端国际化
- Mac OSX终端安装主题(oh my zsh)
- 谷歌浏览器油猴插件安装教程,让你的浏览器更加强大
- zabbix模块配置学习
- Windows下安装及使用NVM
- U盘上安装多个Linux发行版和PE
- ubuntu18.04部署python3、nginx项目
- CentOS8.x系统配置记录
- js根据经纬度换算行驶里程