shell 条件语句

目录

测试

 test测试文件的表达式 是否成立

格式

选项

比较整数数值

格式

选项

字符串比较

常用的测试操作符

格式

逻辑测试

格式

且 (全真才为真)

或 (一真即为真)

常见条件

双中括号

[[ expression ]] 用法

( ){ }  可以将多个命令组合在一起,批量执行

if语句的结构

分支结构

单分支

双分支

多分支

举例

单分支

判断是否为超级管理员

​编辑

判断主机连通性

多分支

考试成绩

case

格式

字符

例子

考试成绩

石头剪刀布

echo

date

seq 


测试

 test测试文件的表达式 是否成立

格式

1.test  条件表达式

2. [ 条件表达式 ]  (注意[ ]空格,否则会失败)

3.[ 操作符 文件或目录 ]

选项

-d:测试是否为目录(Directory)

[root@localhost ~]# test -d /etc/
[root@localhost ~]# echo $?
0

-e:测试目录或文件是否存在(Exist)

[root@localhost ~]# test -e /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e /fwf
[root@localhost ~]# echo $?
1

-a:测试目录或文件是否存在(Exist) 

[root@localhost ~]# test -a /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -a /fwf
[root@localhost ~]# echo $?
1

 a和e的区别在于a不可以取非

[root@localhost ~]#[ ! -e /etc/shadow ]
[root@localhost ~]#echo $?
1
[root@localhost ~]#[ ! -a /etc/shadow ]
[root@localhost ~]#echo $?
0

-f:测试是否为文件(File)

[root@localhost ~]# test -f /etc/init.d
[root@localhost ~]# echo $?
1
[root@localhost ~]# test -f /etc/yum.conf
[root@localhost ~]# echo $?
0

-r:测试当前用户是否有权限读取(Read)

-w:测试当前用户是否有权限写入(Write)

-x:测试当前用户是否有权限执行(eXcute)

root执行权限别人没有root也没有,别人有root也有

[root@localhost 123]# ll /etc/shadow
----------. 1 root root 1266 11月  8 13:21 /etc/shadow
[root@localhost 123]# [ -r /etc/shadow ]
[root@localhost 123]# echo $?
0
#实际效果,不是表面显示,注意root权限
[root@localhost 123]# [ -x /etc/shadow ]
[root@localhost 123]# echo $?
1
#root执行权限别人没有root也没有,别人有root也有
[root@localhost 123]# 

-L: 测试是否为软连接文件

[root@localhost /]# test -L /etc/localtime
[root@localhost /]# echo $?
0
[root@localhost /]# test -L /etc/yum.conf
[root@localhost /]# echo $?
1
[root@localhost /]# 

测试是否成功使用 $? 返回值(0为正确,非0不正确)

比较整数数值

格式

[ 整数1 -操作符 整数2 ] 公式

选项

-eq:第一个数等于(Equal)第二个数

-ne:第一个数不等于(Not Equal)第二个数

-gt:第一个数大于(Greater Than)第二个数

-lt:第一个数小于(Lesser Than)第二个数

-le:第一个数小于或等于(Lesser or Equal)第二个数

-ge:第一个数大于或等于(Greater or Equal)第二个数

[root@localhost /]# a=6
[root@localhost /]# b=9
[root@localhost /]# [ $a -eq $b ]
[root@localhost /]# echo $?
1
[root@localhost /]# [ $a -le $b ]
[root@localhost /]# echo $?
0
[root@localhost /]#

字符串比较

常用的测试操作符

=:字符串内容相同

!=:字符串内容不同,! 号表示相反的意思

-z:字符串内容为空

-n: 字符是否存在

格式

[ 字符串1 = 字符串2 ] 是否相同

[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=xuyucheng  
[root@localhost /]# [ $qwe = $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]# 

[ 字符串1 != 字符串2 ] 是否不相同

[root@localhost /]# qwe=xuyucheng
[root@localhost /]# rty=taishuail
[root@localhost /]# [ $qwe != $rty ]
[root@localhost /]# echo $?
0

[ -z 字符串 ] 是否为空

[root@localhost /]# rty=taishuail
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
1
[root@localhost /]# rty=" "
[root@localhost /]# [ -z $rty ]
[root@localhost /]# echo $?
0
[root@localhost /]# 

[ -n 字符串 ] 字符是否存在

逻辑测试

格式

1.  [ 表达式1 ] 操作符 [ 表达式2 ] ...

2.   命令1 操作符 命令2 ...

且 (全真才为真)

第一个要真 第二 个也要真 才能是真

如果第一个为假 ,整个 就为假 不用执行下个操作

cmd1 && cmd2

或 (一真即为真)

如果第一个 为真 那么 不用执行第二个

第一个为假 ,才需要执行第二个

cmd1 || cmd2

常见条件

-a或&&:逻辑与,“而且”的意思全真才为真

-o或||:逻辑或,“或者”的意思一真即为真

!:逻辑否

双中括号

[[ expression ]] 用法

== 左侧字符串是否和右侧的PATTERN相同

 注意:此表达式用于[[ ]]中,PATTERN(元字符)为通配符

=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配

 注意: 此表达式用于[[  ]]中;扩展的正则表达式

[root@localhost ~]# xuc=tre.log
[root@localhost ~]# [[ "$xuc" == *.log ]]  //是否有.log结尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]# xuc=tre.text       //将字符串重新定义
[root@localhost ~]# [[ "$xuc" == *.log ]]    //是否有.log结尾的
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$xuc" != *.log ]]    //!取反 是否没有.log结尾的
[root@localhost ~]# echo $?
0
[root@localhost ~]# 

( ){ }  可以将多个命令组合在一起,批量执行

[root@localhost ~]# (cd /opt;ls)
999       nginx-1.18.0           qqq.sh  test2
aa        nginx-1.18.0.tar.gz    rh
a.tar.gz  nginx-1.18.0.tar.gz.0  test
etc       qqq                    test1

( )会开启子shell

{ }  不会开启子进程

if语句的结构

if语句  单分支   判断条件  成功执行  

                         不成功       不执行

分支结构

单分支

if 判断条件;

then   条件为真的分支代码

fi

双分支

if 判断条件;then

条件为假的分支代码

fi

多分支

if 判断条件1
then
 条件1为真的分支代码

elif 判断条件2
then
 条件2为真的分支代码

elif 判断条件3;then
 条件3为真的分支代码

...
else
 以上条件都为假的分支代码  托底

fi

举例

单分支

判断是否为超级管理员
#!/bin/bashif [ "$USER" != "root" ]
then
echo "非用户管理员"
else
echo "是管理员用户"
fi

判断主机连通性
#!/bin/bash
ping -c 3 192.168.17.2
if 
[ $? = 0 ]
then 
echo "与真机网络通畅"
exit 1
fi
echo "与真机不通"

多分支

考试成绩
#!/bin/bash
read -p "请输入你的成绩:" cjif [ $cj -ge 85 ]&&[ $cj -le 100 ]
then
echo "你的成绩为$cj"
echo "你的成绩为优秀"elif [ $cj -ge 70 ]&&[ $cj -le 84 ]
then
echo "你的成绩为$cj"
echo "你的成绩为良好"elif [ $cj -ge 60 ]&&[ $cj -le 69 ]
then
echo "你的成绩为$cj"
echo "你的成绩为合格"
else
echo "你的成绩为$cj"
echo "你的成绩不合格"
fi

case

格式

case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

read -p

case $num  in

条件判断1)

命令序列)
 ;;
条件判断2)
 命令序列2)
 ;;

esac

字符

* 任意长度任意字符

? 任意单个字符

[0-9] 指定范围内的任意单个字符

|   或者,如: a|b

例子

考试成绩
[root@localhost qqq]# bash 4.sh
请输入你的分数4
4 不及格
[root@localhost qqq]# cat 4.sh
#!/bin/bashread -p "请输入你的分数" cjcase $cj in
100)
echo "$cj 你好棒!"
;;
[89][0-9])
echo "$cj 一般般吧,仍需努力"
;;
[67][0-9])
echo "$cj 及格"
;;
[0-9]|[1-5][0-9])
echo "$cj 不及格"
;;*)
echo "输入有误"
esac

石头剪刀布
#!/bin/bash
m=`echo $[RANDOM%3+1]`
read -p "请输入 1.石头2.剪刀3.布:" hif [ $m -eq $h ]
then
echo  "打成平局"
bash $0
elif [ $h -eq 1 -a  $m -eq 2 -o $h -eq 2 -a $m -eq 3 -o $h -eq 3  -a $m -eq 1 ]
then
echo "人类胜利"
else
echo  机器胜利
fi#!/bin/bash
key=`echo $[RANDOM%3+1]`
read -p "请输入1包子 2剪子 3 锤子:" numcase $num in
1)num="包子"
;;
2)num="剪子"
;;
3)num="锤子"
;;
*)echo "你输错了!"exit
;;
esaccase $key in
1)key="包子"
;;
2)key="剪子"
;;
3)key="锤子"
;;
esacif [ $num = "包子" -a $key = "锤子"  -o $num = "剪子" -a $key = "包子" -o $num = "锤子" -a $key = "剪子" ]
thenecho 机器出的是$key
echo 你出的是$num echo "人类胜利"
elif [ $num = $key ]
then
echo 机器出的是$key
echo 你出的是$num echo "打成平局再来一次"
elseecho 机器出的是$key
echo 你出的是$num 
echo "机器胜利"
fi

echo

echo -n   表示不换行输出

echo -e   表示输出转义符

常用的转义符

不换行显示

\c  使用在数字中间会把后面内容删除


date

date查看当前系统时间

-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间

%F 完整日期格式,等价于 %Y-%m-%d

% T 时间(24小时制)(hh:mm:ss

cal  2023

seq 

从1 开始 步长为2  到10 为止

从 20开始  步长为 -1 到1 为止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于一些bug的解决1、el-input的输入无效2、搜索之后发现数据不对3、el多选框、单选框点击无用4、

el-input输入无效 原来的代码是 var test null 但是我发现不能输入任何值 反倒修改test的初始值为123是可以的 于是我确定绑定没问题 就是修改的问题 于是改成 var test ref() v-model绑定的值改成test.value就可以了 因为ref是相应式的 可以通过输入…

Go语言多线程爬虫万能模板它来了!

对于长期从事爬虫行业的技术员来说,通过技术手段实现抓取海量数据并且做到可视化处理,我在想如果能写一个万能的爬虫模板,后期遇到类似的工作只要套用模板就能解决大部分的问题,如此提高工作效率何乐而不为? 以下是一个…

Mac自带的看图如何连续查看多张图片

一、问题 mac看访达里的图片时,双击打开一张图片,然后按上下左右键都没法切换到另外的图片。而且也没找到像window一样单击缩略图可以看到预览图。其实是自己不懂得怎么使用,哈哈哈😂 二、方法 2.1、图标方式 可以看到缩略图&a…

新的centos7.9安装jenkins(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 接上一节文章。 这个版本默认git也安装好了,所以全局配置这个不需要了。 maven安装3.9.3版本…

前缀和——DP35 【模板】二维前缀和

文章目录 🍎1. 题目🍒2. 算法原理🍅3. 代码实现 🍎1. 题目 题目链接:【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com) 描述 给你一个 n 行 m 列的矩阵 A ,下标从1开始。 接下来有 q 次查询&#xff0…

【OpenCV实现图像:使用OpenCV生成拼图效果】

文章目录 概要通用配置不考虑间隔代码实现考虑间隔代码实现小结 概要 概要: 拼图效果是一种将图像切割为相邻正方形并重新排列的艺术效果。在生成拼图效果时,可以考虑不同的模式,包括是否考虑间隔和如何处理不能整除的部分。 不考虑间隔&a…

【NLP】GPT 模型如何工作

介绍 2021 年,我使用 GPT 模型编写了最初的几行代码,那时我意识到文本生成已经达到了拐点。我要求 GPT-3 总结一份很长的文档,并尝试了几次提示。我可以看到结果比以前的模型先进得多,这让我对这项技术感到兴奋,并渴望…

HQL刷题 50道

HQL刷题 50道 尚硅谷HQL刷题网站 答案 1.查询累积销量排名第二的商品 select sku_id from (select sku_id, dense_rank() over (order by total desc) rnfrom (select sku_id, sum(sku_num) totalfrom order_detailgroup by sku_id) t1) t2 where rn 2;2.查询至少连续三天下…

php 时区查看和设置

php的时区&#xff0c;关系到相关时间函数的结果 其他相关&#xff1a; linux时区设置&#xff1a;链接 pgsql时区设置&#xff1a; 一、查看可以用的时区列表 新建一个php文件&#xff0c;输入下面程序即可 <?php echo "<pre>"; var_dump(timezone_id…

IOS+Appium+Python自动化全实战教程

由于公司的产品坐落于不同的平台&#xff0c;如ios、mac、Android、windows、web。因此每次有新需求的时候&#xff0c;开发结束后&#xff0c;留给测试的时间也不多。此外&#xff0c;一些新的功能实现&#xff0c;偶尔会影响其他的模块功能正常的使用。 网上的ios自动化方面的…

计算机网络之物理层(数据通信有关)

一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性&#xff0c;导致数据传输方式的不同&#xff1b;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议&#xff08;一般称通信规程&#xff09; 这些协议…

基于高质量训练数据,GPT-4 Turbo更出色更强大

11月7日消息&#xff0c;OpenAI在首届开发者大会上正式推出了GPT-4 Turbo。 与GPT-4相比&#xff0c;GPT-4 Turbo主要有6方面的提升&#xff1a; 1、扩展下文对话长度&#xff1a;GPT4最大只能支持8k的上下文长度&#xff08;约等于6000个单词&#xff09;&#xff0c;而GPT-4…

智能小车速通版——手把手教程

考虑到大部分学校&#xff0c;会发放简易小车来作为智能车初期培训和筛选的工具&#xff0c; 于是&#xff0c;我写一个简单的教程&#xff0c;能够实现简单小车的电磁循迹。 通过这个教程&#xff0c;能够通过简化的步骤搭建寻迹小车&#xff0c;进而了解整个智能车是如何实…

Redis-Redis持久化,主从哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次数…

【操作系统】I/O软件层次结构

文章目录 1. 前言2. I/O软件层次结构2.1 用户层软件2.2 设备独立性软件2.3 设备驱动程序2.4 中断处理程序 1. 前言 偶然看到“程序员的护城河是什么”这个话题&#xff0c;作为一个工作两年多的程序员吧&#xff0c;经常看到网上关于各种35岁危机、裁员甚至猝死之云云。最近也…

modbus协议及modbus TCP协议

一、Modbus协议 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 Modbus通信协议具有多个变种&#xff0c;其中有支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的是Modbus RTU&#xff08;通信效率最高&#xff0c;基于串口&am…

springboot前后端分离项目配置https接口(ssl证书)

文章目录 说明vue.js前端部署vue.js项目axios请求配置本地创建日志文件创建Dockerfile文件配置ssl证书nginx.confvue项目打包上传创建容器部署 后端springboot项目部署配置ssl证书打包部署 补充&#xff1a;jsk证书和pfx证书补充&#xff1a;两种证书的转化JKS转PFXPFX 转 JKS …

Elasticsearch:将最大内积引入 Lucene

作者&#xff1a;Benjamin Trent 目前&#xff0c;Lucene 限制 dot_product (点积) 只能在标准化向量上使用。 归一化迫使所有向量幅度等于一。 虽然在许多情况下这是可以接受的&#xff0c;但它可能会导致某些数据集的相关性问题。 一个典型的例子是 Cohere 构建的嵌入&#x…

使用 Lhotse 高效管理音频数据集

Lhotse 是一个旨在使语音和音频数据准备更具灵活性和可访问性的 Python 库&#xff0c;它与 k2 一起&#xff0c;构成了下一代 Kaldi 语音处理库的一部分。 主要目标&#xff1a; 1. 以 Python 为中心的设计吸引更广泛的社区参与语音处理任务。 2. 为有经验的 Kaldi 用户提供…

SpringBoot——启动类的原理

优质博文&#xff1a;IT-BLOG-CN SpringBoot启动类上使用SpringBootApplication注解&#xff0c;该注解是一个组合注解&#xff0c;包含多个其它注解。和类定义SpringApplication.run要揭开SpringBoot的神秘面纱&#xff0c;我们要从这两位开始就可以了。 SpringBootApplicati…