当前位置: 首页 > 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单纯的设置坐标系只是改了…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...