我们一起来学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的条件判断的更多相关文章

  1. Shell脚本IF条件判断和判断条件总结

    转自:http://m.jb51.net/article/56553.htm 这篇文章主要介绍了Shell脚本IF条件判断和判断条件总结,本文先是给出了IF条件判断的语法,然后给出了常用的判断条件总结 ...

  2. Shell学习(六)——条件判断总结

    Shell学习(六)--条件判断总结 [1]https://www.cnblogs.com/zhw-626/p/8528001.html [2]https://www.cnblogs.com/yizh ...

  3. Shell学习笔记 - 条件判断式

    1. 判断格式 1) test 参数 文件 例: test -e /root/install.log 2) [ 参数 文件 ]  -- 推荐使用 例: [ -e /root/install.log ] ...

  4. shell中的条件判断以及与python中的对比

    shell中比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格. if ....; then          ...

  5. shell编程2 ---条件判断语句

    shell编程2 一.条件判断语句 1.按照文件类型进行判断 eg:test -e /etc/passwd  或者  [ -e /etc/passwd ]  &&echo yes || ...

  6. linux shell中的条件判断语句

    http://bbs.chinaunix.net/thread-396805-1-1.html shell 判断语句 流程控制 "if" 表达式 如果条件为真则执行then后面的部 ...

  7. shell中的条件判断if和测试

    (一)条件判断 if 中-z 到 -d 的意思 [ -a file ] 若file存在,则为真. [ -b file ] 若file存在且是一个块特殊文件,则为真. [ -c file ] 若file ...

  8. shell中的条件判断、参数以及变量替换

    文章转自: http://www.cnblogs.com/maxupeng/archive/2011/07/02/2096551.html 一.test命令 test命令是shell内部命令,它计算作 ...

  9. shell中的条件判断

    read命令 命令的语法: read [参数] 变量名 常用的参数如下: -t timeout 设定超时时间. -p prompt 设定提示信息,该提示信息将会显在光标前. 条件测试: 条件测试可以判 ...

  10. SHELL编程之条件判断

    一.if 语句结构 (1)单分支语句结构 if  条件测试操作 then  命令序列 fi #!/bin/bash MOUNT_DIR="/media/cdrom/" #-d $M ...

随机推荐

  1. CTF-sql-order by盲注

    本文章只讨论了order by盲注,关于order by的报错等注入不在本文章讨论范围,另有文章. 让我们先来看看本文章所使用的表的内容,如下图: 接下来先了解一下order by的基础知识: ord ...

  2. 【笔记】thanos ruler组件

    阅读官网文档后的笔记:https://thanos.io/tip/components/rule.md/ 感受 官网第一个话就强调风险,看来坑很多,能不用尽量不用 recording rule &am ...

  3. 【记录一个问题】没用任何用处的解决了libtask的context.c在32位NDK下的编译问题

    32位下用ndk编译libtask出现这样的错误: [armeabi-v7a] Compile thumb : task <= context.c /Users/ahfu/code/androi ...

  4. 切换不同的echarts时,出现图标缩小,报警告,Can’t get dom width or height!

    出现这样的原因是因为,在切换的时候,图表所对应的标签还没有显示出来,最好将代码放在$nextick里面执行,并且,采用使用v-if进行切换 转载:https://www.pianshen.com/ar ...

  5. gin中提供静态文件服务

    package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 静 ...

  6. vue开源项目有点全

    目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★31142 - 饿了么出品的Vue2的web UI工具套件 Vux ★14104- 基于Vue和 ...

  7. Kubernetes 证书默认1年过期时间修改

    使用过的kubeadm搭建K8s集群的朋友知道,默认自动生成的证书有效期只有 1 年,因此需要每年手动更新一次证书,这种形式显然对实际生产环境来说很不友好:因此下面教给大家修改这个过期时间的终极方法. ...

  8. PyTorch 介绍 | DATSETS & DATALOADERS

    用于处理数据样本的代码可能会变得凌乱且难以维护:理想情况下,我们希望数据集代码和模型训练代码解耦(分离),以获得更好的可读性和模块性.PyTorch提供了两个data primitives:torch ...

  9. Vue中的发布订阅分析(Vue2/3中的 emit 实现)

    Vue中的发布订阅模式分析 模块:instanceEventEmiiter.ts(在下方有简单实现和解析) 在Vue3中,已经取消了对这个模块的引用,故而不再支持 $on.$off.$once相关的方 ...

  10. 使用Docker快速搭建Halo个人博客到阿里云服务器上[附加主题和使用域名访问]

    一.前言 小编买了一个服务器也是一直想整个网站,一直在摸索,看了能够快速搭建博客系统的教程.总结了有以下几种方式,大家按照自己喜欢的去搭建: halo wordpress hexo vuepress ...