Linux--shell脚本语言—/—<2>

一、shell 基本语法

1、shell字符串

字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了) 字符串可以由单引号' ' 包围,也可以由双引号" " 包围,也可以不用引号 。它们之间是有区别的。

1) 字符串举例:
2)三种形式的区别
由单引号' '包围的字符串:

任何字符都会原样输出,在其中使用变量是无效的。

字符串中不能出现单引号,即使对单引号进行转义也不行。

由双引号" "包围的字符串:

如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。

字符串中可以出现双引号,只要它被转义了就行。

不被引号包围的字符串:

不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。

字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

3)获取字符串长度${# str}

具体方法如下:

string_name 表示字符串名字。

运行结果为:

4) Shell字符串拼接(连接、合并)

在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接,非常简单粗暴。请看下面的例子:

其运行结果为:

5) 字符串的截取

Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取

1、从指定位置开始截取

这种方式需要两个参数 :除了指定起始位置 ,还需要截取长度 ,才能最终确定要截取的字符串。 既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是 Shell 同时支持两种计数方式。

1.1 从字符串左边开始计数

其格式如下:

其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。

如果将截取长度省略,那么将截取起始位置后面所有的字符串

1.2从右边开始计数

截取格式如下:

同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数。

注意:从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。 不管从哪边开始计数,截取方向都是从左到右。

或者带上截取长度:

2、从指定字符(子字符串)开始截取

这种截取方式无法指定字符串长度只能从指定字符(子字符串)截取到字符串末尾。Shell 可以截取指定字符(子字符串)右边的所有字符,也可以截取左边的所有字符。

2.1 使用 # 号截取右边字符

其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串),* 是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。

如果不需要忽略 chars 左边的字符,那么也可以不写*****

注意,以上写法遇到第一个匹配的字符(子字符串)就结束了

2.2 指定最后一个子字符串

最后一个指定字符(子字符串)再匹配结束,那么可以使用##,具体格式为:

2.3 使用 % 截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:

请注意 * 的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以 *****应该位于 chars 的右侧。其他方面%和#的用法相同。

2.4 字符串操作汇总

2、shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。 与

大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

例如:

创建一个简单的数组:

或者

2.1 读取数组

读取数组元素值的一般格式是:

实例:

2.2 关联数组

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。 关联数组使用 declare 命令来声明,语法格式如下:

-A 选项就是用于声明一个关联数组。 关联数组的键是唯一的。 以下实例我们创建一个关联数组 site,并创建不同的键值:

我们也可以先声明一个关联数组,然后再设置键和值:

2.2.1 访问关联数组元素可以使用指定的键

格式如下:

实例:

其输出结果为:

2.3 获取数组中的所有元素

使用 @ 或 * 可以获取数组中的所有元素,例如:

运行脚本,其结果为:

2.4 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

3、Shell运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

算数运算符

关系运算符

布尔运算符

字符串运算符

文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awkexpr,expr 最常用。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

3.1 算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

注意:

条件表达式要放在方括号之间,并且要有空格,例如: [a==b] 是错误的,必须写成 [ $a == $b ]。

算术运算符实例:

3.2 关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

关系运算符实例:

其结果为:

3.3 布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

布尔运算符实例:

3.4 逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

实例:

3.5 字符串运算符

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

3.6 文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。 属性检测描述如下:

相关推荐
嚯——哈哈16 分钟前
AWS云服务器:开启高效计算的新纪元
服务器·云计算·aws
嚯——哈哈16 分钟前
从入门到精通:解析如何使用亚马逊云服务器(AWS EC2)
运维·服务器·aws
编程修仙1 小时前
Collections工具类
linux·windows·python
芝麻团坚果1 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
Elastic 中国社区官方博客1 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
写点什么啦1 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
wellnw1 小时前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
DC_BLOG1 小时前
Linux-Nginx虚拟主机
linux·运维·nginx
坐公交也用券1 小时前
使用Python3实现Gitee码云自动化发布
运维·gitee·自动化