当前位置: 首页 > news >正文

【Shell】基础语法(二)

文章目录

  • 一、Shell基本语法
    • 文件名代换
    • 命令代换
    • 算术代换
    • 转义字符
    • 引号
  • 二、Shell脚本语法
    • 条件测试
    • 分支结构
    • 循环
  • 三、总结


一、Shell基本语法

文件名代换

用于匹配的字符称为通配符(Wildcard),如:* ? [ ] 具体如下:

  • *: 匹配0个或多个任意字符

在这里插入图片描述

  • ?:匹配一个任意字符

在这里插入图片描述

  • [ ]:匹配方括号中任意一个字符的一次出现

在这里插入图片描述

代换成功的前提是文件必须存在,如果文件不存在,则带换不了。

参数扩展:

  • touch {1, 2, 3, 4} / touch{1..4}.txt

在这里插入图片描述


命令代换

执行某一条命令,将这个命令的标准输出的内容存到某个变量中。

varname=cmd arg1 arg2 ...
varname=$(date)

#!/bin/bash 
DateTime=`date`
echo "DateTime is " $DateTime 

在这里插入图片描述

获取当前脚本所在路径:

#获取当前脚本所在路径 ,在这个路径touch一个1.txt
curPath=$(cd `dirname $0`;pwd)
touch $curPath/1.txt

在这里插入图片描述


算术代换

做最基本的整数运算

var=45
var2=2
echo $[var+3]
echo $((var+3))
echo $((var*var2))
echo $(($var*$var2))
# 将10以八进制来解析,最后得到的是10进制的8,最后再加11等于19
echo $[8#10+11]

在这里插入图片描述


转义字符

和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:

在这里插入图片描述

引号

单引号:

和C语言不同,Shell脚本中的单引号和双引号都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对就输入回车,Shell会给出续行提示符,要求用户把引号配上对。例如:

在这里插入图片描述在这里插入图片描述

双引号:

被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引号的处理方式不同。

在这里插入图片描述

当我们使用变量之前,如果变量是作为一个参数来传递的,应该习惯性的加双引号,防止变量中有空格。


二、Shell脚本语法

条件测试

shell中如何表示真假?直接使用某条命令的返回状态来判断真假——main函数的返回值 。我们知道,在main函数中,0表示正常返回,非0表示非正常返回。跟C语言是相反的。

我们可以通过$?,来获取上一条命令的返回状态。

在这里插入图片描述

条件测试的命令: test 表达式 / [ 表达式 ]

  • ( EXPRESSION ) 测试该表达式是否为真
  • ! EXPRESSION 取反
  • EXPRESSION1 -a EXPRESSION2 逻辑与
  • EXPRESSION1 -o EXPRESSION2 逻辑或
  • -n STRING 判断字符串不是空串
  • -z STRING 判断字符串长度为0
  • STRING1 = STRING2 判断字符串相等
  • STRING1 != STRING2 判断字符串不等
  • INTEGER1 -eq INTEGER2 判断整数相等
  • INTEGER1 -ge INTEGER2 判断整数1>=整数2
  • INTEGER1 -gt INTEGER2 判断整数1>整数2
  • INTEGER1 -le INTEGER2 判断整数1<=整数2
  • INTEGER1 -lt INTEGER2 判断整数1<整数2
  • INTEGER1 -ne INTEGER2 判断整数1!=整数2
  • FILE1 -nt FILE2 判断文件1比文件2新(指最后修改时间)
  • FILE1 -ot FILE2 判断文件1比文件2旧
  • -b FILE 块设备
  • -c FILE 字符设备
  • -d FILE 判断是否目录
  • -e FILE 单纯判断文件是否存在
  • -f FILE 判断文件是一个普通文件
  • -h FILE / -L FILE 判断是否一个符号链接
  • -k FILE 判断文件的粘着位是否被设置
  • -p FILE 判断文件是否是一个命名管道
  • -r FILE 判断文件是否有读权限
  • -s FILE 判断文件存在并且大小大于0字节
  • -S FILE 判断文件是否是一个socket文件
  • -t FD 判断某个文件描述符被终端打开
  • -w FILE 判断是否有写权限
  • -x FILE 有执行权限

分支结构

和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。

#!/bin/bash
if [ -f /bin/bash ] # 判断bash文件是不是一个普通文件
then echo "/bin/bash is a file"
else echo "/bin/bash is NOT a file"
fi

在这里插入图片描述

:”是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。

#!/bin/bash
if false
then: 
elseecho "always false"
fi

在这里插入图片描述

#!/bin/bash
echo "Is it morning? Please answer yes or no!"
#读取用户输入的一个变量
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]
thenecho "Good morning"
elif [ "$YES_OR_NO" = "no" ] ; thenecho "Good afternoon"
elseecho "Not recognized":
fi

在这里插入图片描述

除此之外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性。

分支结构:

case 表达式 in
val1|pattern1)xxxxxx;;
val2|pattern2)xxxxxx;;
*)xxxx;;
esac     #将case倒着写
#!/bin/bash
echo "Is it morning? Please answer yes or no!"
#读取用户输入的一个变量
read YES_OR_NOcase "$YES_OR_NO" in
yes|y|Yes|YES)echo "Good morning";;
[nN][oO])echo "Good afternoon";;
*)echo "Not recognized";;
esac

在这里插入图片描述


循环

for循环的遍历方式:

for varname in 列表 ; do  #do可以单独写一行,如果写在for这一样就要分号.....echo $varname
done控制循环次数
for i in {1..100}
do...
done遍历目录
for i in `ls`
do....
done
for FRUIT in apple banana pear
do echo "I like $FRUIT"
done

在这里插入图片描述

# 计算从1加到100的值,使用for循环
sum=0
for i in {1..100}
do sum=$[$sum+$i]
done
echo $sum

在这里插入图片描述


# 遍历当前目录,看当前目录中的普通文件和目录
for f in `ls`
do if [ -f "$f" ]thenecho "$f 是一个文件"elif [ -d "$f" ]then  echo "$f 是一个目录"else echo "Not recognized"fi
done

在这里插入图片描述

while循环的遍历方式

while 命令|条件测试
doxxxx
donebreak 和 continue 跟C中的一样
echo "Please input paswd"
sum=1
read try
while [ "$try" != "secret" ]
do if [ "$sum" -ge 5 ]then echo"Error 5 times, exit"breakfi echo "Sorry, try again!"read try sum=$[$sum+1]
done

三、总结

Shell就是命令行工具的胶水,没有任何语言能像Shell一样方便地将一大堆命令行工具组合起来。原则上来说,Shell做什么都可以,但显然它最适合的是自动化,因为只需要将你原来手动敲的命令都复制到一个文件里面就行了。好了,我们下期见!

相关文章:

【Shell】基础语法(二)

文章目录 一、Shell基本语法文件名代换命令代换算术代换转义字符引号 二、Shell脚本语法条件测试分支结构循环 三、总结 一、Shell基本语法 文件名代换 用于匹配的字符称为通配符&#xff08;Wildcard&#xff09;&#xff0c;如&#xff1a;* ? [ ] 具体如下&#xff1a; *…...

Unity之webgl端通过vue3接入腾讯云联络中心SDK

腾讯云联络中心SDK:云联络中心 Web-SDK 开发指南-文档中心-腾讯云 (tencent.com) 1 首先下载Demo ​ 1.1 对其进行解压 ​ 1.2根据文档操作 查看README.md,根据说明设置server下的dev.js里的相关参数。 然后打开电脑终端&#xff0c;cd到项目的路径&#xff1a; ​ 安装…...

《算法竞赛·快冲300题》每日一题:“连接草坪(II)”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 连…...

LNMP及论坛搭建(第一个访问,单节点)

LNMP&#xff1a;目前成熟的一个企业网站的应用模式之一&#xff0c;指的是一套协同工作的系统和相关软件 能够提供静态页面服务&#xff0c;也可以提供动态web服务&#xff0c;LNMP是缩写 L&#xff1a;指的是Linux操作系统。 N&#xff1a;指的是nginx&#xff0c;nginx提…...

EXCEL,多条件查询数字/文本内容的4种方法

目录 1 问题&#xff1a;如何根据多条件查询到想要的内容 2 方法总结 2.1 方法1&#xff1a; sumif() 和sumifs() 适合查找符合条件的多个数值之和 2.2 方法2&#xff1a;使用lookup(1,0/((区域1条件1)*(区域2条件2)*....),结果查询区域) 2.3 方法3&#xff1a;使用 ind…...

全志D1-H (MQ-Pro)驱动 OV5640 摄像头

内核配置 运行 m kernel_menuconfig 勾选下列驱动 Device Drivers ---><*> Multimedia support --->[*] V4L platform devices ---><*> Video Multiplexer[*] SUNXI platform devices ---><*> sunxi video input (camera csi/mipi…...

2023下半年软考初级网络管理员报名入口-报名流程-备考方法

软考初级网络管理员2023下半年考试时间&#xff1a; 2023年下半年软考初级网络管理员的考试时间为11月4日、5日。考试时间在全国各地一致&#xff0c;建议考生提前备考。共分两科&#xff0c;第一科基础知识考试具体时间为9:00到11:30&#xff1b;第二科应用技术考试具体时间为…...

QEMU源码全解析29 —— QOM介绍(18)

接前一篇文章&#xff1a;QEMU源码全解析28 —— QOM介绍&#xff08;17&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 前文讲解了类…...

从入门到精通——【初识网络】

文章目录 前言1.网络发展背景2.计算机网络分类3.通信协议4.协议分层5. TCP/IP协议6.网络协议支持7. 封装&分用8. 客户端&服务端 前言 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统…...

MySQL alter命令修改表详解

目录 ALTER TABLE 语法 ALTER TABLE 实例 添加一列 添加多列 重命名列 修改列定义 修改列名和定义 添加主键 删除列 重命名表 修改表的存储引擎 结论 在使用表的过程中&#xff0c;如果您需要对表进行修改&#xff0c;您可以使用 ALTER TABLE 语句。通过 ALTER TAB…...

Vulnhub: ColddWorld: Immersion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.183 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.183 查看login的源码发现提示&#xff1a;page和文件/var/carls.txt 漏洞利用 wfuzz探测account.php页面发现文件包含&am…...

Redis 总结【6.0版本的】

还差什么&#xff1f;【按照这个为基础&#xff0c;对照他的Redis路线图&#xff0c;冲冲冲】 Redis的常见操作和命令&#xff1a;Redis基本操作命令&#xff08;图文详解&#xff09;_redis 命令_进击小高的博客-CSDN博客 Redis的持久化&#xff0c;一致性&#xff1a;AOF&…...

状态模式(C++)

定义 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 应用场景 在软件构建过程中&#xff0c;某些对象的状态如果改变&#xff0c;其行为也会随之&#xff0c;而发生变化&#xff0c;比如文档处于只读状态&#xff0c;其支持的行为和读写…...

承泰科技Q3再获30多个智驾项目,新增订单0.86亿!累计近11亿!

中国毫米波雷达市场正处于高速发展期&#xff0c;以承泰科技为代表的本土供应商在前装量产赛道上展示出加速度。 高工智能汽车研究院预测&#xff0c;随着L2及L2持续处于市场增长的高速期&#xff0c;对应毫米波雷达上车量将在2023年实现30-50%的同比增速。 根据高工智能汽车…...

以太网Ethernet通信协议

一、以太网简介 计算机网络可分为局域网(LAN)、 城域网(MAN)、广域网(WAN)、互联网(Initernet)。局域网按传输介质所使用的访问控制方法可分为&#xff1a;以太网(Ethernet)、光纤分布式数据接口(FDDI)、异步传输模式(ATM)、令牌环网(Token Ring)、交换网(Switching) 等&#x…...

内网横向移动—资源约束委派

内网横向移动—资源约束委派 1. 资源约束委派1.1. 基于资源的约束委派的优势1.2. 约束性委派和基于资源的约束性委派配置的差别1.3. 利用条件1.3.1. 什么用户能够修改msDS-AllowedToActOnBehalfOfOtherIdentity属性1.3.2. 将机器加入域的域用户 2. 案例操作2.1. 获取目标信息2.…...

Spring Boot Logback日志格式改为JSON

在阿里云、或者日志分析时使用JSON格式输出日志更加方便。 依赖 增加Logbak JSON解析依赖。 另外需要注意的是JSON格式输出依赖Jackson&#xff0c;根据工程情况按需添加Jackson依赖。 <!--日志--><dependency><groupId>ch.qos.logback.contrib</grou…...

Linux 块设备操作函数

和字符设备的fil_operations一样&#xff0c;块设备也有操作集&#xff0c;为结构体block_device_operations&#xff0c;此结构体定义在include/linux/blkdev.h中&#xff0c;结构体内容如下&#xff1a; struct block_device_operations {int (*open) (struct block_device …...

linux c++网络编程基础:服务端与客户端的实现

在Linux环境下,我们可以使用socket编程来实现网络通信。下面是一个简单的C++版本的客户端和服务端的示例代码。 服务端代码: #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include <string.h> #...

坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

前言&#xff1a; 业务上通过GIS软件将空间数据导入到数据库时&#xff0c;因为不同的数据来源和软件设置&#xff0c;可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系&#xff0c;只是在geoserver单纯的设置坐标系只是改了…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...