我们一起来学Shell - shell的条件判断
文章目录
我们一起来学Shell - 初识shell
我们一起来学Shell - shell的变量
我们一起来学Shell - shell的条件判断
我们一起来学Shell - shell的循环控制
我们一起来学Shell - shell的数组
我们一起来学Shell - shell的函数
我们一起来学Shell - shell的并发及并发控制
我们一起来学Shell - 正则表达式
Shell 条件测试语法
| test 测试表达式 | 利用test命令进行条件测试表达式,test命令与测试表达式之间至少有一个空格 |
|---|---|
| [ 测试表达式 ] | 通过[ ]中括号进行条件测试表达式,[]中括号边界与测试表达式之间至少有一个空格 |
| [[ 测试表达式 ]] | 通过[[ ]]双中括号进行条件测试表达式,[[ ]]双中括号与测试表达式之间至少有一个空格 |
| ((测试表达式)) | 通过(( ))双小括号进行条件测试表达式,(( ))双小括号两端不需要空格,常用于整数对比 |
&&,||,<,>等操作符可用于双中括号[[ ]]中,但不能应用于[ ]中在
[ ]中一般用-a,-o,-lt,-gt来代替
符号说明
(( ))数值比较,运算 C语言
[[ ]]条件测试,支持正则
$(( ))整数运算
$[ ]整数运算
$( )命令替换 shell会先执行括号的cmd,然后将结果作为变量进行替换,替换只能替换标准输出,错误输出不能替换。
${ }Shell中变量的原形,用于限定变量名称的范围,并且支持通配符
[ ]条件测试
( )重新开一个子shell然后执行,最后一个命令可以不用分号,第一个命令和左边括号不必有空格
{ }在当前shell里执行,最后一个命令要用分号,第一个命令和左括号之间必须有一个空格
Shell 测试表达式
文件测试表达式
| 符号 | 功能 |
|---|---|
| -d 文件 | 文件存在且为目录则为真 |
| -f 文件 | 文件存在且为普通文件则为真 |
| -e 文件 | 文件存在则为真,不辩别是目录还是文件 |
| -s 文件 | 文件存在且文件大小不为0则为真 |
| -r 文件 | 文件存在且可读则为真,与执行脚本的用户权限也有关 |
| -w 文件 | 文件存在且可写则为真,与执行脚本的用户权限也有关 |
| -x 文件 | 文件存在且可执行则为真,与执行脚本的用户权限也有关 |
| -L 文件 | 文件存在且为链接文件则为真 |
| f1 -nt f2 | 文件f1比文件f2新则为真,根据文件的修改时间计算 |
| f1 -ot f2 | 文件f1比文件f2旧则为真,根据文件的修改时间计算 |
字符串测试表达式
| 符号 | 参数 | 功能 |
|---|---|---|
| -z | s1 | 如果字符串s1的长度为0,则测试条件为真 |
| -n | s1 | 如果字符串s1的长度大于0,则测试条件为真 |
| sl | 如果字符串s1不是空字符串,则测试条件为真 | |
| =或== | s1=s2 | 如果s1等于s2,则测试条件为真,“=”前后应有空格 |
| != | s1!=s2 | 如果s1不等于s2,则测试条件为真 |
| < | s1 | 如果按字典顺序s1在s2之前,则测试条件为真 |
| > | s1>s2 | 如果按自定顺序s1在s2之后,则测试条件为真 |
- 对于字符串的比较,一定要将字符串
加引号后再比较。如[ -n "$string" ] =与!=可用于判断两个字符串是否相同- 字符串比较的时候,可以加一个x,比如:
if [ "$test"x = "test"x ]; then- 使用单个等号
- 注意到等号两边各有一个空格:这是unix shell的要求
- 当
$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。 - 如果没有这个x,表达式就会报错:[: =: unary operator expected
整数操作符
-eq,-ne等比较符只能用于数字比较,有字符也会先转换成数字然后进行比较
| 在[ ]和test中使用 | 在[[ ]]和(( ))中使用 | 说明 |
|---|---|---|
| -eq | ==或= | 等于,全拼为equal |
| -ne | != | 不等于,全拼为not equal |
| -gt | > | 大于,全拼为greater than |
| -ge | >= | 大于等于,全拼为greater equal |
| -lt | < | 小于,全拼为less than |
| -le | <= | 小于等于,全拼为less equal |
逻辑操作符
| 在[ ]和test中使用 | 在[[ ]]和(( ))中使用 | 说明 |
|---|---|---|
| -a | && | and(与),两端都为真,则结果为真 |
| -o | || | or(或),两端有一个为真,则结果为真 |
| ! | ! | not(非),两端相反,则结果为真 |
测试表达式的区别总结
| 测试表达式符号 | test | [ ] | [[ ]] | (( )) |
|---|---|---|---|---|
| 边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
| 逻辑操作符 | !、-a、 -o | !、-a、 -o | !、&&、|| | !、&&、|| |
| 整数比较操作符 | -eq、-ne、-lt、-gt、-ge、-le | -eq、-ne、-lt、-gt、-ge、-le | -eq、-ne、-lt、-gt、-ge、-le或=、!=、<、>、>=、<= | =、!=、<、>、>=、<= |
| 字符串比较操作符 | =、==、!= | =、==、!= | =、==、!= | =、==、!= |
| 是否支持通配符 | 不支持 | 不支持 | 支持 | 不支持 |
Shell 条件判断之if语句
单分支 IF 条件语句
语法格式
if [ 条件判断式 ];then
条件成立时,执行的程序
fi
if语句使用fi结尾,和一般语言使用大括号结尾不同[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格then后面跟符号条件之后执行的程序,可以放在[ ]之后,用;分割。也可以换行写入,就不需要;了
判断vda1磁盘使用率是否大于90%,如果大于90%,则输出"磁盘已满",反之,则没有输出
#!/usr/bin/env bash
disk_check=$(df -h | grep vda1 | awk '{print $(NF - 1)}' | awk -F '%' '{print $1}')
if (( "${disk_check}" > "90" )); then
echo "磁盘已满"
fi
双分支语句
语法格式
if [ 条件判断式 ];then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
判断vda1磁盘使用率是否大于90%,如果大于90%,则输出"磁盘已满",反之,则输出当前磁盘使用率
#!/usr/bin/env bash
disk_check=$(df -h | grep vda1 | awk '{print $(NF - 1)}' | awk -F '%' '{print $1}')
if (( "${disk_check}" > "90" )); then
echo "磁盘已满"
else
echo "vda1当前使用率为: ${disk_check}%"
fi
多分支语句
语法格式
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件....
else
当所有条件都不成立,最后执行此程序
fi
通过用户输入的数字来判断年龄所在阶段
#!/usr/bin/env bash
read age
if (( "${age}" <= "2" )); then
echo "婴儿"
elif (( "${age}" >= "3" && "${age}" <= "8" )); then
echo "幼儿"
elif (( "${age}" >= "9" && "${age}" <= "17" )); then
echo "少年"
elif (( "${age}" >= "18" && "${age}" <="25" )); then
echo "成年"
elif (( "${age}" >= "26" && "${age}" <= "40" )); then
echo "青年"
elif (( "${age}" >= "41" && "${age}" <= "60" )); then
echo "中年"
else
echo "老年"
fi
Shell 条件判断之case语句
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
语法格式
case 变量名 in
值1)
如果变量的值等于值1则执行指令1
;;
值2)
如果变量的值等于值2则执行指令2
;;
值3)
如果变量的值等于值3则执行指令3
;;
*)
如果变量的值不等于以上列出的任何值则执行默认指令
esac
case 语句的使用总结
case 语句比较适合变量值较少且为固定的数字或字符串集合情况,比如变量的值是已知固定的start/stop/restart等元素,那么采用case语实现就比较适合
case主要是写服务的启动脚本,一般情况下,传参不同且具有少量的字符串,其适用范围窄
if就是取值判断、比较、应用比case更广。几乎所有的case语句都可以用if条件语句实现
case语句就相当于多分支的if/elif/else语句,但case语句的优势是更规范
当用户输入对应的数字选择水果的时候,告诉他选择的水果是什么,并给水果单词加上一种颜色
#!/usr/bin/env bash
cat <<EOF
1.apple
2.pear
3.banana
4.cherry
EOF
read -p "请输入您的选择:" num
red="\033[31m"
green="\033[32m"
yewllo="\033[33m"
blue="\033[34m"
tailer="\033[0m\n"
case $num in
1)
printf "${red} apple ${tailer}"
;;
2)
printf "${green} pear ${tailer}"
;;
3)
printf "${yewllo} banana ${tailer}"
;;
4)
printf "${blue} cherry ${tailer}"
;;
*)
printf "${blue} Usage:$0 {1|2|3|4} ${tailer}"
exit 1
esac
我们一起来学Shell - shell的条件判断的更多相关文章
- Shell脚本IF条件判断和判断条件总结
转自:http://m.jb51.net/article/56553.htm 这篇文章主要介绍了Shell脚本IF条件判断和判断条件总结,本文先是给出了IF条件判断的语法,然后给出了常用的判断条件总结 ...
- Shell学习(六)——条件判断总结
Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...
- Shell学习笔记 - 条件判断式
1. 判断格式 1) test 参数 文件 例: test -e /root/install.log 2) [ 参数 文件 ] -- 推荐使用 例: [ -e /root/install.log ] ...
- shell中的条件判断以及与python中的对比
shell中比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格. if ....; then ...
- shell编程2 ---条件判断语句
shell编程2 一.条件判断语句 1.按照文件类型进行判断 eg:test -e /etc/passwd 或者 [ -e /etc/passwd ] &&echo yes || ...
- linux shell中的条件判断语句
http://bbs.chinaunix.net/thread-396805-1-1.html shell 判断语句 流程控制 "if" 表达式 如果条件为真则执行then后面的部 ...
- shell中的条件判断if和测试
(一)条件判断 if 中-z 到 -d 的意思 [ -a file ] 若file存在,则为真. [ -b file ] 若file存在且是一个块特殊文件,则为真. [ -c file ] 若file ...
- shell中的条件判断、参数以及变量替换
文章转自: http://www.cnblogs.com/maxupeng/archive/2011/07/02/2096551.html 一.test命令 test命令是shell内部命令,它计算作 ...
- shell中的条件判断
read命令 命令的语法: read [参数] 变量名 常用的参数如下: -t timeout 设定超时时间. -p prompt 设定提示信息,该提示信息将会显在光标前. 条件测试: 条件测试可以判 ...
- SHELL编程之条件判断
一.if 语句结构 (1)单分支语句结构 if 条件测试操作 then 命令序列 fi #!/bin/bash MOUNT_DIR="/media/cdrom/" #-d $M ...
随机推荐
- kafka学习笔记(三)kafka的使用技巧
概述 上一篇随笔主要介绍了kafka的基本使用包括集群参数,生产者基本使用,consumer基本使用,现在来介绍一下kafka的使用技巧. 分区机制 我们在使用 Apache Kafka 生产和消费消 ...
- class、抽象类、接口区别
Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 由于抽象类不 ...
- day 11 算法的时间空间复杂度
(1).有以下程序: 求输入的n值(除1和n)之外的所有因子之和. 分析:这里函数内的循环体i初值不能为零.%是表示"取余",0除以任何数都不会存在余数的,所有是余数为0. (2) ...
- Centos下安装Spark
(注:由于第一次安装操作失误,所以重新安装了,因此截图为第一次的截图,命令为第二次安装的命令) (注:图是本人安装所截图,本人安装参考网址:https://www.cnblogs.com/shaosk ...
- JAVA主要类集分类
包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() int 以 int 型返回此 Intege ...
- Windows和Linux关闭占用端口
关闭端口的方式有很多种,但是常用的就是这种比较来的快一点 如果通过以下方式解决不了,可以通过关闭服务来解决 Windows 1.查看端口占用的进程 netstat -ano | findstr 800 ...
- gin框架中使用jwt
生成解析token 如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一.JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本 ...
- GoLang设计模式20 - 组合模式
定义 组合模式是一种结构型设计模式. 当我们想把一组对象当做一个整体来处理时就可以考虑使用组合模式. 组合模式被视为是接口型设计模式是因为它将一组对象组装为一个树状结构.这个树状结构中的每个独立组件都 ...
- NGINX的动静分离;什么是负载均衡
目录 一:动静分离 二:负载均衡 一:动静分离 动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护 ...
- Android Compose的Window Insets
Android Compose的Window Insets 除了app的内容区域外, 还有一些其他的固定元素会显示在手机屏幕上, 顶部的状态栏, 刘海, 底部的导航栏, 还有输入法键盘, 它们都是系统 ...