【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/bashnum=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/bashstr="abcdefg :/"echo ${#str}

 给予可执行权限。

chmod 777 test3_2.sh

 

运行

./test3_2.sh

结果

 

Shell字符串拼接

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

代码3

test3_3.sh

#!/bin/bashStr1="你好,"
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/bashstr1="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/bashShuZu1=(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/bashShuZu=(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/bashShuZu1=(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/bashShuZu=(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/bashdeclare -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

结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Qt Tab键切换焦点顺序:setTabOrder()

使用这个方法setTabOrder(),设置使得焦点的顺序从前到后依次是: ui->lineEdit》 ui->lineEdit_2》ui->lineEdit_3 》ui->lineEdit_4 焦点先在ui->lineEdit上,当按下Tab键时,焦点跑到ui->lineEdit_2上。。。按…

代码随想录day63 | 单调栈P3 | ● 84.

84.柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释&a…

基于yolov8的水果检测系统,系统既支持图像检测,也支持视频和摄像实时检测(pytorch框架)【python源码+UI界面+功能源码详解】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于yolov8的水果检测系统,系统既支持图像检测,也支持视频和摄像实时检测_哔哩哔哩_bilibili (一)简介 基于yolov8的水果检测系统是在pytorch框架下实…

12.买卖股票的最佳时机 II

文章目录 题目简介题目解答解法一:贪心(遍历数组买入即卖)代码:复杂度分析: 解法二:动态规划(双数组)代码:复杂度分析: 题目链接 大家好,我是晓星航。今天为大家带来的是 122. 买卖股票的最佳时…

springboot基本使用九(redis和springcache缓存)

为什么使用缓存: 减少数据库访问次数,从而提高应用程序的性能 redis可以缓存为啥要和spring cache一起使用? redis缓存:是内存级的缓存。它是使用单纯的内存来进行缓存 spring cache缓存:使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方…

目标检测算法YOLOv8简介

YOLOv8论文尚未发布,YOLOv8由Ultralytics公司推出并维护,源码见:https://github.com/ultralytics/ultralytics ,于2024年1月发布v8.1.0版本,最新发布版本为v8.2.0,License为AGPL-3.0。 以下内容主要来自&am…

东南亚服务器租用托管的优势

东南亚地区在国际贸易领域展现出了巨大的潜力和吸引力,其未来的外贸发展前景被认为是广阔且充满了无限商机。这一地区以其人口众多、经济快速发展的特点,结合独特的地理优势和丰富的自然资源,正在吸引全球企业的目光。今天我们一起来看看东南…

QT学习(2)——qt的菜单和工具栏

目录 引出qt的菜单栏工具栏菜单栏,工具栏状态栏,浮动窗口 属性设计ui编辑控件添加图片 总结 引出 QT学习(2)——qt的菜单和工具栏 qt的菜单栏工具栏 菜单栏,工具栏 1QMainWindow 1.1菜单栏最多有一个 1.1.1 QMenuBar…

使用Three.js绘制快速而逼真的水

本文将利用GPUComputationRenderer来实现水波纹的绘制,相似的案例可以看threejs官方的GPGPU Water示例。更多精彩内容尽在数字孪生平台。 什么是 GPGPU GPGPU代表通用图形处理单元(General-Purpose Graphic Processing Unit),意思…

T型三电平逆变器的Simulink仿真

1 T型三电平拓扑的开关状态 图1为T字型-三电平电路单相拓扑,拓扑中共有4个IGBT,4个二极管,还有电容组C1和C2;假设正负母线电压均等,都是Vdc。将T1,T2,T3,T4的状态用1和0分别表示&…

AI + Web3 如何打造全新创作者经济模型?

可编程 IP 的兴起,借助人工智能极大提高创作效率和效能,让 Web3 用户体会到了自主创作和产品制作的乐趣。然而,你知道 AI 时代来临的背景下,创作者经济模型又该如何在 Web3 技术的加持下走向更成熟的运作轨道吗?第 43 …

手机恢复出厂设置会怎么样?一切回到了原点?

随着智能手机的普及,我们每天都在与手机紧密互动,里边存储了大量的个人信息和应用数据。然而,有时候我们会遇到手机卡顿、应用崩溃或数据丢失的问题。这时,恢复出厂设置成为了许多人的选择。那么,手机恢复出厂设置会怎…

网站访问提示不安全怎么办??

当网站访问时提示“不安全”,这通常与网站的SSL证书有关,或者是网站本身存在一些安全风险。以下是一些解决步骤和建议: 1、检查URL前缀:首先,检查URL是否以https://开头。如果仍然是http://,则网站没有使用…

详解GaussDB(DWS)中的行执行引擎

1.前言 GaussDB(DWS)包含三大引擎,一是SQL执行引擎,用来解析用户输入的SQL语句,生成执行计划,供执行引擎来执行;二是执行引擎,其中包含了行执行引擎和列执行引擎,执行引擎…

盘点自动驾驶的技术发展趋势

自动驾驶技术在不断发展变快,我们之前提过算法岗如今越来越卷,从今年的就业局势看,前年还属于蓝海行业的自动驾驶,今年就已经满满关上了招揽之门——呈红海之势。作为在这个行业中摸爬滚打的一以子,我们到底该如何纵观…

agiletc部署

数据库创建及运行 启动命令 cd /AgileTC/case-server&& nohup mvn spring-boot:run &查看是否启动成功 http://192.168.101.:8094/case/caseList/1需要安装java javac等 一、安装java 1 安装java11 sudo yum install java-11-openjdk-devel -y2 切换到java11 …

c++ 获取机器码

看到网上代码代码都没什么好的&#xff0c;自己备用一个 #include <iostream> #include <string> #include <sstream> #include <iomanip> #include <Windows.h> #include <iphlpapi.h> // 包含这个头文件以获取 PIP_ADAPTER_INFO #inclu…

【NodeMCU实时天气时钟温湿度项目 4】通过NTPClient库获取实时网络时间并显示在TFT屏幕上

今天是【实时天气时钟温湿度项目】第四专题&#xff0c;主要内容是&#xff1a;学习导入NTPClient库&#xff0c;通过这个库获取实时网络时间&#xff0c;显示在1.3寸TFT液晶屏幕上。此前三个专题&#xff0c;请选择查看以下链接。 第一专题内容&#xff0c;请参考 【N…

阿里云和AWS负载均衡服务对比分析

在云计算时代,负载均衡作为一种关键的网络基础设施,承担着在多个服务器之间分发网络流量的重要任务。作为全球两大主要的云服务提供商,阿里云和Amazon Web Services(AWS)都提供了强大的负载均衡解决方案。本文将从性能、功能、可用性和成本等方面对两者进行对比分析。我们九河云…

this指针详解

目录 this指针this指针的引出this指针的特性this指针相关例题例题1例题2 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️…