Shell脚本学习(一):Shell内置命令与Shell运算符

Shell内置命令

理解内置命令的含义。

内置命令介绍

Shell内置命令,就是由Bash Shell自身提供的命令,而不是文件系统中的可执行文件。

使用type 可以用来确定一个命令是否是内置命令:

type 命令

演示:

在这里插入图片描述

对于上述演示的两个命令来说,cd就是内嵌的Shell命令,而ifconfig就是一个可执行文件。

通常来说,内置命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘I/O,还需要fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前Shell进程的一个函数,还是在当前Shell环境进程内,减少了上下文切换。

常用的内置命令

alias介绍

alias用于给命令创建别名。

好处:可以将经常操作比较复杂的命令进行设置别名,通过别名的操作提高工作效率。

若该命令不带任何参数,则显示当前Shell进程中的所有别名列表。

在这里插入图片描述
上面的是系统为了方便命令操作系统默认将部分命令创建为别名ll 的命令与 ls -l 的效果一样,就是因为ll 是别名。

alias别名定义语法
alias 别名="命令"

这里使用单引号或者双引号都可以。

演示:

在这里插入图片描述

unalias别名删除语法

删除指定的别名:

unalias 别名

在这里插入图片描述

删除当前Shell环境中所有的别名:

unalias -a

演示是比较简单的,这里不再赘述。

注意:以上两种方式删除都是临时删除当前Shell的别名,如果想永久删除必须去配置文件中手动删除。

echo介绍

echo是一个Shell内置命令,用于在终端输出字符串,并在最后默认加上换行符。

echo输出语法

默认输出换行语法:

echo 字符串

输出不换行语法:

echo -n 字符串
演示:

编写一个脚本文件:
在这里插入图片描述

运行结果如下:

在这里插入图片描述

echo输出转义字符

比如 \n,用于echo输出字符串非结尾处的换行,但是默认echo无法解析\n转义字符。

在这里插入图片描述

这个时候可以使用 -e 参数,该参数用于解析转义字符:

echo -e "字符串中含有转义字符"

在这里插入图片描述

常用的转义字符除了上面的\n换行符之外,还有\c用来清除echo结尾的换行。

read介绍

read是Shell内置命令,用于从标准输入中读取数据并赋值给变量。如果没有进行从重定向,默认就是从终端控制台读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

后续会讲解Shell重定向。

语法
read [-options] [var1 var2 ...]

options表示选项,如下表所示;var表示用来存储数据的变量,可以有一个,也可以有多个。
options和var都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 变量中。
$REPLY 保存read最后一个读入命令的数据。

演示一下:

在这里插入图片描述

options支持的参数:

在这里插入图片描述

需求示例

1、使用read命令给多个变量赋值:

在这里插入图片描述

运行效果如下:

在这里插入图片描述

2、从终端控制台只读取一个字符:
在这里插入图片描述

运行效果如下,注意这里要用bash命令执行,使用sh命令会报-n参数非法的错误,我也不知道为什么:

在这里插入图片描述

3、在终端控制台输入时,设置指定时间内输入密码:

在这里插入图片描述

运行效果如下:

在这里插入图片描述

exit介绍

exit用于退出当前Shell环境进程结束运行,并且可以返回一个状态码。一般使用 $? 可以获取退出状态码。

语法

正确退出语法:

exit # 默认返回状态码0,一般代表命令执行成功

错误退出语法

exit 非0数字 # 数字建议的范围0到255,一般代表命令执行失败
应用场景

1、结束当前Shell进程
2、当Shell进程执行出错退出时,可以返回不同的状态值代表不同的错误

比如打开一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

需求示例

编写Shell脚本使用exit退出,退出时返回一个非0数字状态值,执行脚本文件并打印返回状态值。

在这里插入图片描述

执行效果如下:

在这里插入图片描述

declare介绍

declare命令用于声明Shell变量。可用来声明变量并设置变量的属性,也可用来显示Shell函数。若不加上任何参数,则会显示全部的Shell变量与函数(与执行set指令的效果相同)。

declare命令作用

1、设置变量的属性[重要]
2、查看全部Shell变量与函数
3、实现关联数组变量[重要]

declare设置变量的属性语法
declare [+/-] [aArxif] [变量名称=设置值]

在这里插入图片描述

需求示例

操作一个变量属性,设置为整形\取消整形\设置为只读等操作:

在这里插入图片描述

查看全部Shell变量与函数
declare -f 查询所有函数的定义
declare -F 查询所有函数的名称列表

关于函数后面还会说,这里先了解一下即可。

实现key-value关联数组变量语法

关联数组也称为"键值对(key-value)"数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

语法如下:

declare -A 关联数组变量名=([字符串key1]=值1 [字符串key2]=值2 ...)

declare 也可以用于定义普通索引数组,-a 参数创建普通或索引数组,-A 创建关联数组。
declare -a 索引数组变量名=(值1 值2 …)
declare -a 索引数组变量名=([0]=值1 [1]=值2 …)

获取指定key的值:

${关联数组变量名[key]}

获取所有值:

${关联数组变量名[*]} # 方式1
${关联数组变量名[@]} # 方式2

演示如下:
在这里插入图片描述

运行效果如下:

在这里插入图片描述

注意:之前学习的创建普通索引数组的方式也可以用来创建这种关联数组,但是获取值的时候是错误的,因此要创建关联数组只能使用declare!

Shell运算符

掌握算数运算符的使用。
掌握expr求值表达式命令。

expr 介绍

expr 是evaluate expressions的缩写,译为“求值表达式”。Shell expr是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等,后续讲解。

expr 语法

计算语法:

expr 算数运算符表达式

注意:运算表达式

获取计算结果赋值给新变量语法:

result=`expr 算数运算符表达式`

注意:上面用的是反引号不是单引号嗷。

演示:

在这里插入图片描述

注意:运算符表达式中每个数字与符号之间要有空格。

算数运算符介绍

下表列出了常用的算数运算符,假定变量 a 为 1,变量 b 为 2:

在这里插入图片描述

演示:

在这里插入图片描述

运行结果如下:

在这里插入图片描述

Shell运算符:比较运算符

了解有哪些比较运算符。
掌握推荐使用哪个比较运算符。

整数比较运算符

下表列出了常用的比较运算符,假定变量 a 为 1 ,变量 b 为 2:

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

以其中几个为例简单演示一下:
在这里插入图片描述

在这里插入图片描述

注意:

整数比较运算符只支持整数,不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。
每个命令都有返回值,这个后面我们会讲解退出状态时再具体说明,返回0代表成功,返回1代表失败。

Shell运算符:字符串比较运算符

可以比较2个变量,变量的类型可以为数字(整数,小数)与字符串。

语法

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为"efg":

字符串比较可以使用 [[]] 和 [] 两种方式。

	运算符		:						说明									:			举例

在这里插入图片描述

纠正一下:上图中的 $ 运算符是检测字符串是否不为空,不为空返回 0 为空返回 1 。

注意:字符串比较没有 <= ,但可以通过 [[ “a” < “b” || “a” = “b” ]] 来实现。

依然是以其中几个为例演示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:对于双方括号来说其内的特殊符号不需要进行转义,而单括号则需要。

[[]] 和 [] 的区别

区别1:word splitting 单词分隔

[ [ ] ] 不会有 word splitting 发生。

[ ] 会有 word splitting 发生。

word splitting 介绍

会将含有空格字符串进行分拆分割后比较。

演示:

在这里插入图片描述

区别2:转义字符

[ [ ] ] 对 < 不需要转义,格式为 [[ 字符串1 < 字符串2 ]]
[ ] 需要对 <,> 转义,格式为 [ 字符串1 < 字符串2 ]

演示之前已经提过,这里不再赘述。

结论

更推荐使用双方括号来进行字符串比较运算。

Shell运算符:布尔运算符

介绍

在这里插入图片描述

注意这里我们暂时还会用单方括号,但是后面就不会再用了,因为有test命令的存在。

演示:

在这里插入图片描述

Shell运算符:逻辑运算符

要理解逻辑运算符与布尔运算符区别。

逻辑运算符介绍:

在这里插入图片描述

演示如下:

在这里插入图片描述

Shell运算符:文件测试运算符

能够使用常用文件测试运算符检查文件。

如:文件是否存在、是否可读、是否可执行、是否为空、是否可写、是否是目录、是否是普通文件等。

Linux系统文件系统介绍

-:普通文件
d:目录文件
l:链接文件
b:块设备文件
c:字符设备文件
p:管道文件

演示:

块设备文件,比如在目录/dev下面的计算机硬盘文件:

在这里插入图片描述

设备文件都是对应计算机硬件的,不同的设备文件代表不同的传输数据方式。

文件测试运算符介绍

文件测试运算符用于检测文件的各种属性。

属性检测描述如下:

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

命令虽然有很多,但常用的比较重点的就黄色部分标出来的。

其他检查符:

-S: 判断某文件是否 socket。
-L: link, 检测文件是否存在并且是一个符号链接。

语法如下:

[ options 文件路径字符串 ][[ options 文件路径字符串 ]]

演示:

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

运行结果如下:

在这里插入图片描述

测试这个代码的时候要注意,文件的路径一定要写绝对路径嗷(也就是从文件根目录 / 的位置开始写),否则所有的判断都会走else,我就踩了这个坑…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【我的代码生成器】生成React页面类

有了数据表的结构信息&#xff0c;就能生成React 的页面类&#xff0c;快捷方便。 生成界面如下&#xff1a; 生成的React FrmUser.js页面如下&#xff1a; 只需再写里面的操作逻辑代码。

链表创建的陷阱与细节

链表是线性表的一种&#xff0c;它在逻辑结构上是连续的&#xff0c;在物理结构上是非连续的。 也就是说链表在物理空间上是独立的&#xff0c;可能是东一块西一块的。如下顺序表和链表在内存空间上的对比&#xff1a; 而链表的每一块空间是如何产生联系实现在逻辑结构上是连续…

关于java中的线程池用法

目录 线程池的参数介绍 线程池的工作流程 使用Executors创建常见的线程池 池的思想&#xff0c;在计算机中是非常普遍的概念。顾名思义&#xff0c;池是将一个或多个任务提前创建好&#xff0c;放入容器中&#xff0c;当程序运行的时候直接取出使用&#xff0c;这个容器就叫…

Imagination APXM-6200 CPU:性能卓越,安全可信

随着消费类和工业应用行业的不断发展&#xff0c;对创新性能和效率的需求永不停歇&#xff0c;我们自豪地推出旗下 Catapult CPU 系列的第二款产品&#xff1a;Imagination APXM-6200 CPU 。这款 64 位的高效 RISC-V 应用处理器具有强大的 AI 功能及性能密度&#xff0c;能够为…

基于Java+SpringBoot3+vue3健身房管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

使用openLayers报错Module parse failed: Unexpected token

引入OpenLayers时报错 JavaScript模块解析失败 在构建工具中配置 transpileDependencies 参数&#xff0c;因为 ol 依赖库基于一个目标环境不支持的 ES 版本撰写&#xff0c;将该依赖添加进 vue.config.js 中的 transpileDependencies 选项中 // including the package "…

ruoyi单体+react+antdesign

基于ruoyi vue和Ruoyi-React实现的快速开发工具。 源码地址&#xff1a;GitHub - hebian1994/ruoyi-react-single: use ruoyi to generage java backend code and reacr front end code 前端&#xff1a;基于ant-design-pro 后端&#xff1a;单体springboot项目(非cloud)mysq…

亚马逊云科技数据工程师考试官方免费课程上线啦

自从上次小李哥分享了AWS Data Engineer Associate证书首通经验后&#xff0c;有非常多的小伙伴们问我&#xff0c;应该怎么复习这门考试呢&#xff1f; 这门考试是AWS针对最近大热&#x1f525;的AI、数据分析、数据科学等行业&#xff0c;推出的全新考试。因为刚刚推出&#…

神经网络背后的数学原理

原文地址&#xff1a;The Math Behind Neural Networks 2024 年 3 月 29 日 深入研究现代人工智能的支柱——神经网络&#xff0c;了解其数学原理&#xff0c;从头开始实现它&#xff0c;并探索其应用。 神经网络是人工智能 &#xff08;AI&#xff09; 的核心&#xff0c;为…

uni-start初始化后的微信登录问题

1.使用微信登录 一直提示“获取第三方账号失败”&#xff0c; 原来是在unicloud-->cloudfunctions-->common-->uni-config-center-->uni-id-->config.json文件中配置的微信的appid和appsecret有错误,配置好后就可以获取信息了。 2. 获取信息之后用真机调试报错…

Node.js留言板(超详细注释)

目录结构如下 app.js // 一.引入模块 var http require(http);// 用于创建 HTTP 服务器和处理 HTTP 请求 var fs require(fs);// 用于读取和写入文件 var url require(url);// 用于解析URL// 创建留言数据对象 var msgs [{ name: 牛二, content: "我是妞儿", cr…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末附3个算法源码)

效果: MPU6050姿态解算-卡尔曼滤波+四元数+互补滤波 目录 基础知识详解 欧拉角

【LeetCode】2635. 转换数组中的每个元素

转换数组中的每个元素 编写一个函数&#xff0c;这个函数接收一个整数数组 arr 和一个映射函数 fn&#xff0c;通过该映射函数返回一个新的数组。 返回数组的创建语句应为 returnedArray[i] fn(arr[i], i)。 请你在不使用内置方法 Array.map 的前提下解决这个问题。 示例 1:…

Python爬虫-京东商品评论数据

前言 本文是该专栏的第68篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍京东滑块验证码的解决方法,感兴趣的同学,可以直接翻阅文章《Python如何解决“京东滑块验证码”(5)》进行查看。 而本文,笔者以京东商品详情页的评论数据为例,通过…

【MySQL】索引篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列传送门 1. 什么是索引 2. 索引的特性 3. 索引的分类 4. 索引的优点及缺点 优点 缺点 5.…

全面的网络流量监控

流量监控指的是对数据流进行的监控&#xff0c;通常包括出数据、入数据的速度、总流量。通过网络流量监控&#xff0c;组织可以确保只有业务关键型流量通过网络传输&#xff0c;并限制不需要的网络流量&#xff0c;从而提高网络效率&#xff0c;又可以防止停机、减少 MTTR、帮助…

【氮化镓】微波脉冲对GaN HEMT失效的影响

本文是一篇关于高功率微波脉冲作用下GaN HEMT&#xff08;高电子迁移率晶体管&#xff09;热电多物理场耦合失效的实验研究。文章由Xiangdong Li等人撰写&#xff0c;发表在2023年11月的《IEEE Transactions on Electron Devices》上。文章通过实验研究了在高功率微波脉冲应力下…

英特尔推出中国特供版Gaudi 3芯片,性能暴降92%以应对美国出口管制|TodayAI

英特尔近期发布消息&#xff0c;其将在中国市场推出专为该地区定制的“特供版”Gaudi 3 AI芯片&#xff0c;以符合美国对AI芯片的出口管制。这一版本包括HL-328型号的OAM兼容夹层卡&#xff0c;预计将于6月24日发布&#xff1b;以及HL-388型号的PCIe加速卡&#xff0c;计划在9月…

(二十八)Flask之wtforms库【上手使用篇】

目录&#xff1a; 每篇前言&#xff1a;用户登录验证&#xff1a;用户注册验证&#xff1a;使用示例&#xff1a; 抽象解读使用wtforms编写的类&#xff1a;简单谈一嘴&#xff1a;开始抽象&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【…

L3 【哈工大_操作系统】操作系统启动

本节要点&#xff1a; 1、理解 OS 启动过程发生了什么&#xff0c;理解 OS 与 硬件 与 应用 之间的关系 2、本节讲解了 setup 模块 和 system 模块实现的功能 1、计算机上电时&#xff0c;操作系统在硬盘&#xff08;磁盘&#xff09;上&#xff0c;为了“取指执行”&#xff0…