Shell脚本数组简介及运用

news2024/10/7 9:20:40

目录

一、数组简介

二、数组支持的数据类型

三、定义数组

四、获取数组某个索引处的值

五、遍历数组元素

六、获取数组长度

七、截取数组元素

八、数组的元素替换

1.临时替换

2.永久替换

九、删除元素或数组

十、数组追加元素

1.满元素数组追加

2.非满元素数组追加

十一、函数使用数组传参


一、数组简介

  1. 数组中可以存放多个值(bash 只支持一维数组)

  2. 数组元素的索引从0开始

  3. 数组在括号内指定数组的值,每个值仅能用空格分割

二、数组支持的数据类型

  • 数值类型

  • 字符串类型(每个字符串值需要使用" " 或 ' '引用起来)

三、定义数组

数组名=(元素1 元素2 ...)

数组名=([索引1]=元素1 [索引2]=元素2 [索引n]=元素n...)

数组名=($字符串列表变量)

数组名[索引1]=元素1

数组名[索引2]=元素2

...

数组名[索引n]=元素n

[root@localhost1 ~]#vim array.sh
#!/bin/bash
#法一
arr1=(1 2 3 4 5 6)
​
#法二
arr2=([0]=1 [1]=2 [2]=3 [4]=4)
​
#法三
arr3list="a b c d e"
arre=($arr3list)
​
#法四
arr4[0]=a
arr4[1]=b
arr4[2]=c

四、获取数组某个索引处的值

${数组名[索引值]}

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=(10 20 30 40 50 60)
#读取索引为2的值
echo ${arr1[2]}
​
[root@localhost1 ~]#bash array.sh
30

五、遍历数组元素

${数组名[@]}

${数组名[*]}

​
[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=(10 20 30 40 50 60)
​
echo ${arr1[@]}
​
[root@localhost1 ~]#bash array.sh
10 20 30 40 50 60


​

六、获取数组长度

${#数组名[@]}

${#数组名[*]}

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=(10 20 30 40 50 60)
​
echo ${#arr1[@]}
​
[root@localhost1 ~]#bash array.sh
6

七、截取数组元素

${数组名[@]:索引值:截取元素个数}

${数组名[*]:索引值:截取元素个数}

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=(10 20 30 40 50 60)

echo "索引2处截取4个元素为:${arr1[@]:2:4}"

echo "索引0处截取2个元素为:${arr1[@]:0:2}"

echo "索引5处截取1个元素为:${arr1[*]:5:1}"


[root@localhost1 ~]#bash array.sh
索引2处截取4个元素为:30 40 50 60
索引0处截取2个元素为:10 20
索引5处截取1个元素为:60

 

八、数组的元素替换

1.临时替换

//针对数组中单个元素

${数组名[索引值]/原始字符/替换字符}

//针对数组中所有元素

${数组名[@]/原始字符/替换字符}

${数组名[*]/原始字符/替换字符}

​
[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=(10 20 30 40 50 60)
​
echo "替换2为6:${arr1[1]/2/6}"
​
echo "替换0为1:${arr1[@]/0/1}"
​
echo "替换10为60:${arr1[@]/10/60}"
​
[root@localhost1 ~]#bash array.sh
替换2为6:60
替换0为1:11 21 31 41 51 61
替换10为60:60 20 30 40 50 60


​

2.永久替换

  • 重新定义数组:将需要修改的值手动重写为新的值。

  • 直接修改数组中的元素:数组名[索引值]=修改后的值

  • 将临时替换过的数组重新赋值给原数组:如 array=($array[@]/原始字符/修改后的字符)

九、删除元素或数组

unset ${数组名[索引值]}

unset ${数组名[@]}

unset ${数组名[*]}

[root@localhost1 ~]#array=(1 2 3 4 5 6)

#删除数组索引为2处的元素
[root@localhost1 ~]#unset array[2]
[root@localhost1 ~]#echo ${array[@]}
1 2 4 5 6

#删除数组
[root@localhost1 ~]#unset array[@]
[root@localhost1 ~]#echo ${array[@]}

十、数组追加元素

判断数组值是否满元素

length=${#arr1[@]} echo ${arr1[@]} echo ${arr1[length-1]}

如果有空值,则数组最后一个值不等于元素索引为数组长度-1的元素值

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=([0]=10 [2]=20 [4]=30)
length=${#arr1[@]}
echo ${arr1[@]}
echo ${arr1[length-1]}
​
[root@localhost1 ~]#bash array.sh
10 20 30
20

1.满元素数组追加

数组名[索引值]=元素

数组名[${#数组名[@]}]=元素

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=([0]=10 [2]=20 [4]=30)
length=${#arr1[@]}
echo ${arr1[@]}
echo ${arr1[length-1]}

[root@localhost1 ~]#bash array.sh
10 20 30
20

2.非满元素数组追加

数组名=("${数组名[@]}" 元素1 元素2 ...)

双引号不能省略,否则,当数组array中存在包含空格的元素时会按空格将元素拆分成多个;不能将@替换为*,如果替换为*,不加双引号时与@的表现一致,加双引号时,会将数组array中的所有元素作为一个元素添加到数组中。

数组名+=(元素1 元素2 ...)

待添加元素必须用"()"包围起来,并且多个元素用空格分隔

[root@localhost1 ~]#vim array.sh
#!/bin/bash
arr1=([0]=10 [2]=20 [4]=30)
​
arr1=("${arr1[@]}" 40 50)
​
arr1+=(60 70)
​
echo ${arr1[@]}
​
[root@localhost1 ~]#bash array.sh
10 20 30 40 50 60 70

十一、函数使用数组传参

如果使用位置变量传参,只会传数组的第一个元素,所以需要在函数内部将所以的参数重新组合成一个新的数组变量。

//将一个数组当做参数列表传入函数执行,实现数组值翻倍
[root@localhost1 ~]#vim chuancan.sh
#!/bin/bash
test1() {
  arrlist=($@)    #关键在这里获取数组传入的参数
  for ((i=0;i<${#arrlist[@]};i++))
  do
    newarr[$i]=$[${arrlist[$i]} * 2]
  done
  echo ${newarr[@]}
}
arr=(10 20 30 40 50)
echo "原始数组为:${arr[@]}"
​
result=$(test1 ${arr[@]})
echo "数组值翻倍后为:$result"
​
[root@localhost1 ~]#bash chuancan.sh
原始数组为:10 20 30 40 50
数组值翻倍后为:20 40 60 80 100

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

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

相关文章

【模块三:职业成长】39|能力维度四:如何从做技术到为企业创造生存优势?

你好&#xff0c;我是郭东白。今天这节课是架构师能力维度的第四部分&#xff0c;我们来继续探索架构师成长过程的能力跃迁。不过今天我们会连续讲两个跃迁&#xff1a;从跨域架构师到总架构师&#xff08;首席架构师&#xff09;的跃迁&#xff1b;从总架构师再到 CTO 的跃迁。…

浅尝 xen 虚拟化

前言 之前分享过使用 oVirt 部署私有虚拟化环境, oVirt 是基于 KVM 虚拟化开发了一系列的管理工具, 以 Web Console /CLI 的方式交付使用. 今天记录和分享的是在 VMware Workstation 中使用 Alpine 作为基础操作系统部署 xen 虚拟化环境的简单测试. xen 基本概念 xen 可以理…

chatgpt赋能python:Python的发音

Python的发音 Python是一种广泛使用的编程语言&#xff0c;用于web开发、数据分析、科学计算等众多领域。然而&#xff0c;Python这个词汇的发音在不同的地方却存在差异。在本文中&#xff0c;我们将介绍Python的发音&#xff0c;解决大家的困惑。 发音方式 Python在英语中常…

【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

文章目录 TOPSIS简介方法和原理数学定义数学语言描述现实案例 正负理想解定义实例 量纲 TOPSIS法的算法步骤1.用向量规范化的方法求得规范决策矩阵2.构成加权规范阵C(c~ij~)~m*n~3.确定正负理想解的距离4.计算各方案到正理想解与负理想解的距离5.计算各方案的综合评价指数6.排列…

STM32源码阅读记录之HAL库(SystemTick)

问题 HAL_Delay是怎么做到可以延迟控制的? 分析记录 步骤01&#xff1a;看函数本身 void HAL_Delay(uint32_t Delay); /*** brief 此函数根据变量递增提供最小延迟&#xff08;以毫秒为单位&#xff09;。* note 在默认的实现中&#xff0c;SysTick计时器是时基的来源。它用…

【Leetcode -225.用队列实现栈 -232.用栈实现队列】

Leetcode Leetcode -225.用队列实现栈Leetcode -232.用栈实现队列 Leetcode -225.用队列实现栈 题目&#xff1a;仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 …

chatgpt赋能python:Python实践:如何升级pip

Python实践&#xff1a;如何升级pip Python作为一门高效的脚本语言&#xff0c;被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具&#xff0c;是开发Python应用的必备工具。但是pip在使用过程中&#xff0c;有时候会出现版本不兼容或者出现漏洞等…

chatgpt赋能python:Python取两位小数的方法

Python取两位小数的方法 介绍 Python是一种高级编程语言&#xff0c;因其简洁易懂、跨平台等特点&#xff0c;被广泛应用于科学计算、数据分析、网站开发、人工智能等领域。在编写Python程序时&#xff0c;我们经常需要将浮点数精确到小数点后几位&#xff0c;比如精确到两位…

【0基础教程】Javascript 里的分组正则Capturing Groups使用方法及原理

一、从最简单开始 现有一个字符串&#xff1a; “1-apple” 需要提取出 1 和 apple 来&#xff0c;对应的正则表达式很简单&#xff1a; ^(\d)-(.)$ 对应的代码也比较简单&#xff1a; const str "1-apple"const regexp /^(\d)-(.)$/let match regexp.exec(str)c…

chatgpt赋能python:Python如何升序输出?从入门到实践!

Python如何升序输出&#xff1f;从入门到实践&#xff01; 作为一门高级编程语言&#xff0c;Python是目前应用广泛且最为流行的一门语言之一。它逐渐成为开发者的首选语言&#xff0c;因为它易学易用&#xff0c;可读性强&#xff0c;支持多种编程范式&#xff0c;提供了强大…

chatgpt赋能python:如何升级Python的pip版本

如何升级Python的pip版本 如果你使用Python来进行程序开发&#xff0c;那么你一定需要用到pip&#xff0c;它是Python的包管理器&#xff0c;用于安装和管理各种Python库。 不过&#xff0c;一旦你开始使用pip&#xff0c;你可能会遇到一个问题&#xff1a;你的pip版本可能会…

软考A计划-系统架构师-学习笔记-第二弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

前端vue基于原生check增强单选多选插件

前端vue基于原生check增强单选多选插件, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id12979 效果图如下: #### 使用方法 使用方法 <!-- 多选组件 checkData&#xff1a;多选数据 change&#xff1a;多选事件 --> <ccCheckView…

FreeRTOS:软件定时器

目录 前言什么是硬件定时器什么是软件定时器 一、回调函数二、定时器的配置2.1软件定时器分类2.2定时器相关API函数2.2.1创建软件定时器2.2.2开启软件定时器2.2.3停止软件定时器2.2.4复位软件定时器 三、软件定时器实验3.1实验要求3.2实验代码 前言 什么是硬件定时器 CPU内部…

Limma | 三个组的差异分析怎么分析做呢!?~

1写在前面 高考结束了&#xff0c;不知道各位考生考的怎么样&#xff0c;这种时候总是几家欢喜几家忧&#xff0c;但这也是实现阶级流动的最佳机会。&#x1f914; 回想自己高考过去10几年了&#xff0c;不能说学了医后悔吧&#xff0c;只能说后悔至极&#xff0c;苦不堪言啊&a…

Linux -- 用户和组

目录 一、root用户&#xff08;超级管理员&#xff09; 1.1 切换用户命令&#xff1a;su 和 exit 命令 1.2 sudo命令 二、用户、用户组 2.1 用户组管理 2.1.1 创建用户组 2.1.2 删除用户组 2.2 用户管理 2.2.1 创建用户 2.2.2 删除用户 2.2.3 查看用户所属组 2.2.…

Linux系统防火墙iptables

目录 一、iptables防火墙概述 1.简介 2.netfilter/iptables关系 3.iptables的四表五链 &#xff08;1&#xff09;四表 &#xff08;2&#xff09;五链 4.数据包过滤的匹配流程 &#xff08;1&#xff09;入站 &#xff08;2&#xff09;转发 &#xff08;3&#xff…

前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页

前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id12942 效果图如下: #### 使用方法 使用方法 <!-- pullDown:下拉刷新 back-top: 回到顶部 --> <ccPullScroll class…

OMG--IDL(Interface Definition Language)

OMG--IDL&#xff08;Interface Definition Language&#xff09; 1 概述2 内容缩写IDL 语法和语义概述词法约定ISO Latin-1的字母字符如下表十进制数字字符图形字符格式化字符Tokens注释标识符冲突规则转义标识符关键字IDL识别的其他字符字面量 预处理IDL 语法构建块核心数据类…

dubbo流量录制异常(dubbo2.7.3)的问题解决排查

背景 我们自己基于jvm-sandbox-repeater做的流量录制出现了如下的问题, 从这个问题的堆栈信息来看&#xff0c;是在针对dubbo的调用的时候判断这个dubbo的返回是否有异常的时候&#xff0c;报了空指针异常了。 分析 我们看下具体出错的代码地方是怎么样的吧。 Overridepro…