shell 条件语句

news2024/9/19 20:36:41

目录

测试

 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/bash

if [ "$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 "请输入你的成绩:" cj

if [ $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/bash

read -p "请输入你的分数" cj

case $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.布:" h


if [ $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 锤子:" num

case $num in
1)
 num="包子"
;;
2)
 num="剪子"
;;
3)
 num="锤子"
;;
*)
 echo "你输错了!"
 exit
;;
esac

case $key in
1)
 key="包子"
;;
2)
 key="剪子"
;;
3)
 key="锤子"
;;
esac


if [ $num = "包子" -a $key = "锤子"  -o $num = "剪子" -a $key = "包子" -o $num = "锤子" -a $key = "剪子" ]
then

echo 机器出的是$key
echo 你出的是$num 

echo "人类胜利"
elif [ $num = $key ]
then
echo 机器出的是$key
echo 你出的是$num 

echo "打成平局再来一次"
else

echo 机器出的是$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.coloradmin.cn/o/1238676.html

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

相关文章

shopee数据分析软件:了解市场趋势,分析竞争对手,优化运营策略

在当今数字化时代,数据已经成为了企业决策的重要依据。对于电商行业来说,数据更是至关重要。如果你想在电商领域中脱颖而出,那么你需要一款强大的数据分析工具来帮助你更好地了解市场、分析竞争对手、优化运营策略。而知虾数据软件就是这样一…

Windows + VS2022超详细点云库(PCL1.8.1)配置

本文在结合多位CSDN大佬的步骤,记录以下最全的点云配置过程,防止走弯路(并在最后配上PCL环境配置成功的测试代码-彩色兔子) 一、PCL介绍 PCL概述_pcl技术_一杯盐水的博客-CSDN博客 二、准备工作(PCL版本的下载&…

Banana Pi BPI-R3 Mini 开源路由器,也能拍出艺术美感

香蕉派BPI-R3 Mini路由器板开发板采用联发科MT7986A(Filogic 830)四核ARM A53芯片设计,板载2G DDR 内存,8G eMMC和128MB SPI NAND存储,是一款非常高性能的开源路由器开发板,支持Wi-Fi6 2.4G/5G(MT7976C)&am…

网络知识学习(笔记二)

ios模型规定的网络模型一共有7层,但是实际使用过程中,4层的TCP/IP模型是经常使用的,网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的,前面已经讲了:(1)物理层,(2&a…

汇编语言学习笔记

汇编语言的不同种类 as86汇编:能产生16位代码的Intel 8086汇编 mov ax, cs //cs→ax,目标操作数在前GNU as汇编:产生32位代码,使用AT&T系统V语法 movl var, %eax // var→%eax,目标操作数在后内嵌汇编…

12、人工智能、机器学习、深度学习的关系

很多年前听一个机器学习的公开课,在Q&A环节,一个同学问了老师一个问题“机器学习和深度学习是什么关系”? 老师先没回答,而是反问了在场的同学,结果问了2-3个,没有人可以回答的很到位,我当时也是初学一脸懵,会场准备的小礼品也没有拿到。 后来老师解释“机器学习和…

dolphinscheduler有任务一直在运行(问题)目前对数据库解决

dolphinscheduler有任务一直在运行(问题)目前对数据库解决 危害: 这么多的任务没有结束,会涉及很多问题的,系统的数据盘会不断入职日志,数据量很大, 其实对于dolphinscheduler的性能是下降的&a…

c语言编程(模考3)统计字符串中数字字符的个数

统计字符串中数字字符的个数 #include<stdio.h> int main(){char inputString[100];int digitCount 0;printf("请输入一个字符串&#xff1a;");scanf("%s",inputString);for(int i0;inputString[i]!\0;i){if (inputString[i]>0&&inpu…

怎样实现内网穿透?

第一步&#xff1a;cpolar是一种安全的内网穿透云服务&#xff0c;它将内网下的本地服务器通过安全隧道暴露至公网。使得公网用户可以正常访问内网服务。打开网址 cpolar 下载 。 步骤&#xff1a; 打开网站>点击免费试用>创建账号>下载应用一直点下一步下载完成。第…

@PropertySource适配通配符加载到Environment的一种方案

PropertySource可将配置文件加载到内存&#xff0c;时间有限说干的&#xff0c;PropertySource注解有4个参数&#xff0c;其中value表示要加载文件的路径&#xff0c;这个参数不支持通配符。还有一个参数PropertySourceFactory是加载配置文件的工厂&#xff0c;这两个参数配合使…

【云原生】初识 Service Mesh

目录 一、什么是Service Mesh 二、微服务发展历程 2.1 微服务架构演进历史 2.1.1 单体架构 2.1.2 SOA阶段 2.1.3 微服务阶段 2.2 微服务治理中的问题 2.2.1 技术栈庞杂 2.2.2 版本升级碎片化 2.2.3 侵入性强 2.2.4 中间件多&#xff0c;学习成本高 2.2.5 服务治理功…

大家为什么开始配置长效IP代理?长效IP代理有什么优势?

随着网络技术的发展&#xff0c;越来越多的人开始关注网络安全和隐私保护。其中&#xff0c;长效IP代理作为一种安全、高效的解决方案&#xff0c;受到了越来越多人的关注。本文将探讨大家为什么开始配置长效IP代理&#xff0c;以及长效IP代理的优势。 一、长效IP代理的优势1.保…

Python Pandas简介及基础教程+实战示例。

文章目录 前言一、Pandas简介二、Python Pandas的使用关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Pan…

马蹄集oj赛(双周赛第十五次)

目录 小码哥的开心数字 淘金者 捡麦子 小码哥玩游戏 手机测试 自动浇花机 买月饼 未来战争 双人成行 魔法水晶球 ​编辑自驾游 文章压缩 银河贸易市场 小码哥的开心数字 子难度&#xff1a;青铜 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 小码哥有超能…

HCIP-四、MUX-vlanSuper-vlan+端口安全

四、MUX-vlan&Super-vlan端口安全 MUX-vlan实验拓扑实验需求及解法1. 在SW1/2/3分别创建vlan10 20 30 402. SW1/2/3之间使用trunk链路&#xff0c;仅允许vlan10 20 30 40 通过。3. SW与PC/Server之间使用access链路。4. ping验证&#xff1a; Super-vlan端口安全实验拓扑实…

在矩池云使用安装AgentTuning

AgentTuning 是清华大学和智谱AI共同推出的 AI Agent方案。 AgentTuning可以令LLM具备更强大的泛化能力&#xff0c;而且同时保持其通用语言能力&#xff0c;项目中包含的AgentInstruct 数据集和 AgentLM 模型均已开源。 项目地址&#xff1a;https://github.com/THUDM/Agent…

扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

算法 全排列的应用

#include <iostream> #include <string>using namespace std;// 交换字符串中两个字符的位置 void swap(char& a, char& b) {char temp a;a b;b temp; }void fun(string str) {string a str.substr(0,4); int aa;sscanf(a.c_str(), "%d",…

如何在windows使用别名远程执行命令

需求背景 在开发中,需要在服务器执行脚本,需要如下几步操作: 1.打开xshell 2.登录服务器 3.进入命令脚本的路径 4.执行脚本 但是,作为懒人来说,操作太繁琐了,真麻烦,能不能一键就解决那么多操作?所以,开始研究windows有没有这个东西,而且不需要额外的软件就可以实现的.结…