【Shell编程】3.Shell字符串、Shell数组

目录

Shell字符串

代码1

test3_1.sh

运行

结果

获取字符串长度

代码2

test3_2.sh

运行

结果

Shell字符串拼接

代码3

test3_3.sh

运行

结果

Shell字符串截取

从指定位置开始截取

从字符串左边开始计数

从字符串右边开始计数

从指定字符开始截取

使用#号截取右边字符

使用%号截取左边字符

代码4

test3_4.sh

运行

结果

Shell数组的定义

获取数组元素

代码5

test3_5.sh

运行

结果

Shell获取数组长度

代码6

test3_6.sh

运行

结果

Shell数组拼接、合并

代码7

test3_7.sh

运行

结果

Shell删除数组元素

代码8

test3_8.sh

运行

结果

Shell关联数组

代码9

test3_9.sh

运行

结果

Shell字符串

字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。

str1=aaaaa
str2='bbbbb'
str3="ccccc"

三种形式的区别:

  1. 不被引号包围的字符串:不被引号包围的字符串中出现变量时也会被解析;字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

  2. 由单引号包围的字符串:任何字符都会原样输出,在其中使用变量是无效的;字符串中不能出现单引号,对单引号进行转义也不行。

  3. 由双引号" "包围的字符串: 如果其中包含了某个变量,那么该变量会被解析,得到该变量的值,而不是原样输出;字符串中可以出现双引号。

代码1

test3_1.sh

#!/bin/bash

num=20
str1=aaa$numaa
str2='bbb$num bb'
str3="ccc$num \"cc\""

echo $str1
echo $str2
echo -e $str3

给予可执行权限。

chmod 777 test3_1.sh

 

运行

./test3_1.sh 

结果

获取字符串长度

${#字符串名}
${#string_name}

代码2

test3_2.sh

#!/bin/bash

str="abcdefg :/"

echo ${#str}

 给予可执行权限。

chmod 777 test3_2.sh

 

运行

./test3_2.sh

结果

 

Shell字符串拼接

将两个字符串并排放在一起就能实现拼接。

代码3

test3_3.sh

#!/bin/bash

Str1="你好,"
Str2="世界!"

str1=$Str1$Str2      #中间不能有空格
str2="$Str1 $Str2"   #如果被双引号包围,那么中间可以有空格
str3=$Str1": "$Str2  #中间可以出现别的字符串
str4="$Str1: $Str2"  #这样写也可以
str5="${Str1}aaa ${Str2}bbb"  #这个时候需要给变量名加上大括号

echo $str1
echo $str2
echo $str3
echo $str4
echo $str5

给予可执行权限。

chmod 777 test3_3.sh

 

运行

./test3_3.sh

结果

 

Shell字符串截取

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

从指定位置开始截取

       这种方式需要两个参数:除了指定起始位置,还需要截取长度,才能最终确定要截取的字符串。

       既然需要指定起始位置,那么就涉及到计数方向的问题,到底是从字符串左边开始计数,还是从字符串右边开始计数。答案是Shell同时支持两种计数方式

  • 从左边开始计数时,起始数字是0(这符合程序员思维);从右边开始计数时,起始数字是1(这符合常人思维)。计数方向不同,起始数字也不同。

  • 不管从哪边开始计数,截取方向都是从左到右。

从字符串左边开始计数

${字符串: 起始位置: 截取长度}
${string: start: length}

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

从字符串右边开始计数

${字符串: 0-从右边数截取的起始位置: 截取长度}
${string: 0-start: length}

从指定字符开始截取

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

使用#号截取右边字符

使用#号可以截取指定字符(或者子字符串)右边的所有字符。

${字符串#*子字符串}
${string#*chars}

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

使用%号截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符。

${字符串%子字符串*}
${string%chars*}

         注意*的位置,因为要截取chars左边的字符,而忽略chars右边的字符,所以*应该位于chars的右侧。

代码4

test3_4.sh

#!/bin/bash

str1="aaabbbccc aaabbbccc"
echo -e "str1=${str1}\n"

echo "-----------------左边开始计数截取字符串-----------------"
echo ${str1: 2: 9}
echo -e "--------------------------------------------------------\n"

echo "-----------左边开始计数截取字符串,省略length-----------"
echo ${str1: 2}
echo -e "--------------------------------------------------------\n"

echo "-----------------右边开始计数截取字符串-----------------"
echo ${str1: 0-13: 9}
echo -e "--------------------------------------------------------\n"

echo "-----------右边开始计数截取字符串,省略length-----------"
echo ${str1: 0-13}
echo -e "--------------------------------------------------------\n"

echo "------------------使用#号截取右边字符-------------------"
echo "使用#*,匹配到第一个就结束:${str1#*bb}"
echo "使用##*,匹配到最后一个结束:${str1##*bb}"
echo -e "--------------------------------------------------------\n"

echo "------------------使用%号截取左边字符-------------------"
echo "使用%*,匹配到最后一个结束:${str1%bb*}"
echo "使用%%*,匹配到第一个就结束:${str1%%bb*}"
echo -e "--------------------------------------------------------\n"

给予可执行权限。

chmod 777 test3_4.sh

运行

./test3_4.sh

结果

Shell数组的定义

数组名=(元素1 元素2 元素3 ... 元素n)
array_name=(ele1  ele2  ele3 ... elen)
  1. 常用的Bash Shell只支持一维数组,不支持多维数组。Shell数组元素的下标也是从0开始计数。

  2. 在Shell中,用括号( )来表示数组,数组元素之间用空格来分隔。

  3. Shell是弱类型的,它并不要求所有数组元素的类型必须相同。

  4. Shell数组的长度不是固定的,定义之后还可以增加元素。

  5. 无需逐个元素地给数组赋值。

注意:赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

获取数组元素

获取数组元素的值。

${数组名[下标]}
${array_name[index]}

array_name是数组名,index是下标。

使用@或*可以获取数组中的所有元素。

代码5

test3_5.sh

#!/bin/bash

ShuZu1=(29 100 13 "你好,世界!" 91 44)
echo "ShuZu1:${ShuZu1[@]}"                #输出所有数组元素
ShuZu1[10]=66                           #给第10个元素赋值(此时会增加数组长度)
echo "增加元素,ShuZu1:${ShuZu1[*]}"      #输出所有数组元素
echo "第3个元素:${ShuZu1[3]}"            #输出第3个元素

给予可执行权限。

chmod 777 test3_5.sh 

 

运行

./test3_5.sh

结果

Shell获取数组长度

利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数。

${#数组名[@]}
${#数组名[*]}
${#array_name[@]}
${#array_name[*]}

代码6

test3_6.sh

#!/bin/bash

ShuZu=(29 100 13)
echo ${#ShuZu[*]}

#向数组中添加元素
ShuZu[10]="你好,世界!"
echo ${#ShuZu[@]}
echo ${#ShuZu[10]}

#删除数组元素
unset ShuZu[1]
echo ${#ShuZu[*]}

给予可执行权限。

chmod 777 test3_6.sh

运行

./test3_6.sh

结果

Shell数组拼接、合并

       Shell数组拼接(数组合并),将两个数组连接成一个数组。拼接数组的思路是:先利用@或*,将数组扩展成列表,然后再合并到一起。

数组=(${数组1[@]} ${数组2[@]})
数组=(${数组1[*]} ${数组2[*]})
array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

array1和array2是需要拼接的数组,array_new是拼接后形成的新数组。

代码7

test3_7.sh

#!/bin/bash

ShuZu1=(23 56)
ShuZu2=(99 "你好,世界!")
ShuZu=(${ShuZu1[@]} ${ShuZu2[*]})
echo ${ShuZu[@]}  

给予可执行权限。

chmod 777 test3_7.sh

运行

./test3_7.sh

结果

Shell删除数组元素

在Shell中,使用unset关键字来删除数组元素。

unset 数组名[下标]
unset array_name[index]

array_name表示数组名,index表示数组下标。

删除整个数组,所有元素都会消失。

unset 数组名
unset array_name

代码8

test3_8.sh

#!/bin/bash

ShuZu=(23 56 99 "你好,世界!")
echo ${ShuZu[@]}

unset ShuZu[1]
echo ${ShuZu[@]}

unset ShuZu
echo ${ShuZu[*]}

给予可执行权限。

chmod 777 test3_8.sh 

 

运行

./test3_8.sh 

结果

 

Shell关联数组

      关联数组使用字符串作为下标,而不是整数。关联数组也称"键值对(key-value)"数组,key为下标,value为元素值。

declare -A 数组名		#声明关联数组
数组名[索引]=值		#一次赋一个值
数组名=([索引1]=值1 [索引2]=值2 [索引3]=值3)		#一次赋多个值

代码9

test3_9.sh

#!/bin/bash

declare -A GuanLian_ShuZu                #声明关联数组

GuanLian_ShuZu=([name]="张三" [sex]="男" [age]=17)
GuanLian_ShuZu[addr]="中国"
GuanLian_ShuZu[email]="xxx@mail.com"

echo "name对应的值为:${GuanLian_ShuZu[name]}"
echo "email对应的值为:${GuanLian_ShuZu[email]}"
echo "该关联数组一共有:${#GuanLian_ShuZu[@]}个元素"
echo "数组全部元素为:${GuanLian_ShuZu[*]}"
echo "数组的所有下标为:${!GuanLian_ShuZu[*]}"

 给予可执行权限。

chmod 777 test3_9.sh 

 

运行

./test3_9.sh

结果

 

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

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

相关文章

煤矿防爆气象传感器

TH-WFB5随着工业技术的不断发展,煤矿作为我国能源领域的重要组成部分,其安全生产问题一直备受关注。在煤矿生产过程中,井下环境复杂多变,瓦斯、煤尘等易燃易爆物质的存在使得井下安全工作尤为重要。为了提高煤矿生产的安全性&…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到HDFS、Hbase,简单来说flume就是收集日志的。 2.Flume基础架构…

inBuilder 低代码平台新特性推荐 - 第十八期

今天来给大家带来的是inBuilder低代码平台特性推荐系列第十八期——表单设计器集成预约日历组件。 一、场景介绍 项目上希望用日历的形式展示某地点在一段时间内的预约记录,表单设计器新增支持创建日历预约视图,并配置预约属性。 二、运行效果 三、前…

成都一体化污水处理成套设备如何选型

一体化污水处理成套设备因其占地面积小、操作简便、处理效果稳定等优点,在小型污水处理项目中得到了广泛应用。在选型时,应考虑以下几个关键因素: 处理规模:根据需要处理的污水量(通常以每天处理的立方米数表示&#x…

滑动窗口篇: 长度最小子数组|无重复字符最长字串

目录 1、滑动窗口算法 1.1 核心概念 1.2 基本步骤 1.3 应用场景 1.4 优势 2. leetcode 209 长度最小子数组 暴力解题思路: 滑动窗口思路: 3、无重复字符的最长子串 暴力解题思路: 滑动窗口思路: 1、滑动窗口算法 滑动…

React 第二十九章 React 和 Vue 描述页面的区别

面试题:React 和 Vue 是如何描述 UI 界面的?有一些什么样的区别? 标准且浅显的回答: React 中使用的是 JSX,Vue 中使用的是模板来描述界面 前端领域经过长期的发展,目前有两种主流的描述 UI 的方案&#xf…

基于MWORKS 2024a的MIMO-OFDM 无线通信系统设计

一、引言 在终端设备和数据流量爆发式增长的今天,如何提升通信系统容量、能量效率和频谱利用率成为5G通信的关键问题之一。大规模天线阵列作为5G及B5G无线通信关键技术通过把原有发送端天线数量提升一个或多个数量级,实现波束聚集、控制波束转向&#x…

《架构风清扬-Java面试系列第29讲》聊聊DelayQueue的使用场景

DelayQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题,老规矩,我们将从使用场景和代码示例来进行讲解 来,思考片刻,给出你的答案 1,使用场景 实现:延迟队列,其中元素只有在其预定…

使用Flask-Admin创建强大的后台管理系统

文章目录 安装Flask-Admin创建Flask应用添加Flask-Admin添加模型扩展延伸自定义视图权限管理文件上传 结语 在Web应用开发中,后台管理系统是至关重要的组成部分,它能够让管理员轻松管理应用的各种数据和配置。Flask-Admin是一个功能强大的Flask扩展&…

常见排序算法——希尔排序

基本原理 希尔排序在插入排序的基础之上,将待排序序列分成组,分成 gap 个组,组的数量通过 length / 2 获得,比如6个元素的序列,那么就是 3 个组,每个组两个元素,然后将每个组的元素进行插入排…

【Web后端】servlet基本概念

1.ServletAPI架构 HttpServlet继承GenericServletGenericServlet实现了Servlet接口,ServletConfig接口,Serializable接口自定义Servlet继承HttpServlet 2.Servlet生命周期 第一步:容器加载Servlet第二步:调用Servlet的无参构造方法&#xf…

【程序设计和c语言-谭浩强配套】(适合专升本、考研)

一晃大半年没更新了,这一年一直在备考,想着这几天把前段时间学的c语言给大家分享一下,在此做了一个专栏,有需要的小伙伴可私信获取o。 简介:本专栏所有内容皆适合专升本、考研的复习资料,本人手上也有日常…

关于架构设计:什么是完美?

这篇不谈技术。 为什么写这篇文章?因为刚毕业时看一本关于软件架构设计的书,记得有一句关于完美的话,但后来无论如何都想不起来了。只记得和飞机有关。而今年在看“The Pragmatic Programmer: your journey to mastery”第2版(20…

##13 如何在Python中优雅地使用异常处理

文章目录 引言1. 异常处理基础2. 处理多种异常3. 捕捉所有异常4. finally 语句5. 自定义异常结语参考链接 引言 在编程中,错误是在所难免的。Python提供了异常处理机制,允许程序在遇到错误时优雅地恢复。本文将介绍Python中异常处理的基本概念&#xff…

Mac YOLO V9推理测试(基于ultralytics)

环境: Mac M1 (MacOS Sonoma 14.3.1) Python 3.11PyTorch 2.1.2 一、准备工作 使用YOLO一般都会接触ultralytics这个框架,今天来试试用该框架进行YOLO V9模型的推理。 YOLOv9目前提供了四种模型下载:yolov9-c.pt、yolov9-e.pt、gelan-c.p…

异常处理/__LINE__ 与 __FILE__ 宏在调试和异常处理中的高级使用

文章目录 概述痛点分析_LINE_ 代码所在行号_LINE_ 直接转为字符串_LINE_ 作为整型数据使用_LINE_标记宏函数的调用位置 _FILE_ 代码所在文件名简单实验不期望 _FILE_ 宏代表全路径 assert 使用了 _FILE_ 和 _LINE_借助TLS技术小结 概述 _LINE_和_FILE_是C/C中的预定义宏&#…

【Sql-02】 求每个省份最新登陆的三条数据

SQL 输出要求数据准备sql查询结果 输出要求 要求输出,userid_1,logtime_1,userid_2,logtime_2,userid_3,logtime_3 数据准备 CREATE TABLE sqltest (province varchar(32) NOT NULL,userid varchar(250) DEFAULT NULL,logtime datetime ) ENGINEInnoDB DEFAULT C…

Spring框架中常见注解

Spring: SpringMVC: RequestMapping用在类上表示所有该类下方法的父路径 RequestParam 做映射,前端请求的参数映射到控制器Controller的处理方法上的参数上。 【当参数需要设置默认值(前端没有发送这个参数)、参数名…

禁止打开浏览器时弹出 internet explorer 11 停用的通知

计算机管理(我的电脑图标上右键) - 管理模板 - windows 组件 - internet explorer 启用隐藏 internet explorer 11 停用通知,如下图所示

每日算法之二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是…