Shell编程--数组

数组

  • 1.定义数组
    • 1.1.普通数组
    • 1.2.关联数组
    • 1.3.数组常用定义方法
  • 2.使用数组
    • shell数组中"*" 和 "@" 区别

1.定义数组

数组也是一种变量,常规变量只能保存一个值,数组可以保存多个值
关联数组跟普通数组的区别:
普通数组:通过索引来确定值;
关联数组:标签和值互相关联,通过调用标签来获取标签对应的值。
引用数组:${array_name[index]}

1.1.普通数组

只能用整数作为数组的索引(用索引作为数组的标识,即:下标[0]/[1])

[root@localhost ~]# books=( linux shell awk sed )    //在python中叫列表
[root@localhost ~]# echo ${books[0]}
linux
[root@localhost ~]# echo ${books[1]}
shell
[root@localhost ~]# echo ${books[2]}
awk

1.2.关联数组

可以使用字符串作为数组的索引
关联数组需要提前声明,通过declare命令来声明
Declare命令:declare [-选项]
参数说明
-a :定义为数组–array(普通数组)
-A:定义关联数组

[root@localhost ~]# declare -A myarry1    //先声明数组为关联数组
[root@localhost ~]# myarry1=([name]=tom [sex]=man [age]=18)    //通过标签来确定值,而不是通过索引号来确定值
[root@localhost ~]# echo ${myarry1[name]}    //调用时,通过调用数组[标签名]的方式来调用
tom
[root@localhost ~]# echo ${myarry1[age]}
18

如果事先没有声明,会发生什么呢?

[root@localhost ~]# liangzai=([name]=liangzai [age]=18 [sex]=male)
[root@localhost ~]# echo ${liangzai[name]}
male
[root@localhost ~]# echo ${liangzai[age]}
male
//每次调用的都是最后一个标签的值

设置完数组再声明可以么?

[root@localhost ~]# declare -A liangzai
-bash: declare: liangzai: 无法将索引数组转化为关联数组

得出结论:在使用关联数组前一定要先声明该数组为关联数组

1.3.数组常用定义方法

定义方法1:

[root@localhost ~]# declare -a myarry=(5 6 7 8)
[root@localhost ~]# echo ${myarry[2]}
显示结果为 7

定义方法2:

[root@localhost ~]# array1=( one two three four five six )
[root@localhost ~]# array2=(tom jack alice)
[root@localhost ~]# array3=(`cat /etc/passwd`)    //希望是将文件中的每一行作为一个值赋给数组array3
[root@localhost ~]# array3=($(cat /etc/passwd))    //或者这样写也可以
//执行结果
[root@localhost ~]# echo ${array3[0]}
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# echo ${array3[1]}
bin:x:1:1:bin:/bin:/sbin/nologin[root@localhost ~]# array4=(tom jack alice "bash shell")
[root@localhost ~]# array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
//执行结果:
[root@localhost ~]# echo ${array5[7]}
linux shell
[root@localhost ~]# echo ${array5[8]}    //打印第8个索引为空[root@localhost ~]# echo ${array5[20]}
saltstack
#如果指定索引号和现有的冲突,指定索引号的内容会覆盖原索引内容

定义方法3:自定义索引号

//语法:数组名[index]=变量值
[root@localhost ~]# vim array6.sh
#!/bin/bash 
area[11]=23 
area[13]=37 
area[51]="UFO"//示例
[root@localhost ~]# vim shuzu.sh
#!/bin/bash
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
NAME[5]="ZZ"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "sixth Index: ${NAME[5]}"//输出结果
[root@localhost ~]# bash shuzu.sh 
First Index: BJ
Second Index: SH
sixth Index: ZZ

2.使用数组

[root@localhost ~]# vim a.sh    //这里@和*作用一样
#!/bin/bash
aa=(哈哈哈 嘿嘿嘿 略略略 886)
echo "数组中第一个元素为:"${aa[0]}   //访问数组中的第一个元素
echo "数组中所有的元素为:"${aa[@]}   //访问数组中所有的元素 等同与echo ${aa[*]}
echo "数组中元素的个数为:"${#aa[@]}  //统计元素的个数
echo "数组中每个索引为:"${!aa[@]}  //打印索引[root@localhost ~]# bash a.sh
数组中第一个元素为:哈哈哈
数组中所有的元素为:哈哈哈 嘿嘿嘿 略略略 886
数组中元素的个数为:4
数组中每个索引为:0 1 2 3
常见的应用场景
//批量创建用户,在公司中按照部门来创建账号
op=(liangzai1 liangzai2)
front=(laowang laowu)
backend=(laolu laochen)
test=(laozhang laoluo)//通过访问数组的方式批量创建用户
user=(liangzai1 liangzai2 liangmei1 liangmei2)
for i in "${user[@]}"
doid $i &>/dev/null || useradd $iecho "$i用户创建成功"
done
​
[root@localhost ~]# id liangzai1
uid=1001(liangzai1) gid=1001(liangzai1)=1001(liangzai1)
​
​//删除用户
#!/bin/bash
user=(liangzai1 liangzai2 liangmei1 liangmei2)
for i in "${user[@]}"
do#id $i &>/dev/null || useradd $i#批量删除用户id $i &>/dev/null && userdel -r  $i#echo "$i用户创建成功"echo "$i用户删除成功"
done
您可以访问数组中的所有项目通过以下方式之一:
${array_name[*]}
${array_name[@]}

shell数组中"*" 和 “@” 区别

关于在shell脚本中数组变量中“星号 * " ”@“区别
“星号 * " 当变量加上双引号后,会当成一串字符串处理(会当成一个整体)
”@”当变量加上双引号后,依然当做数组处理(会挨个处理)
在没有加上双引号""的情况下效果是等效的

[root@localhost ~]# vim shuzu1.sh
#!/bin/sh
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
echo "${NAME[*]}"
echo "${NAME[@]}"
[root@localhost ~]# bash shuzu1.sh 
BJ SH SZ GZ HZ
BJ SH SZ GZ HZ//示例 
[root@localhost ~]# vim test1.sh
#!/usr/bin/env bash
array=(gz cloud 19)
echo "case 1"
for line in "${array[@]}"
doecho $line
done
echo ""
​
echo "case 2"
for line in "${array[*]}"
doecho $line
done
echo ""
​
echo "case 3"
for line in ${array[*]}
doecho $line
done
echo ""
​
echo "case 4"
for line in ${array[@]}
doecho $line
done
echo ""//执行结果 
[root@localhost ~]# bash test1.sh 
case 1
gz
cloud
19case 2
gz cloud 19case 3
gz
cloud
19case 4
gz
cloud
19

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

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

相关文章

linux高级篇基础理论十一(GlusterFS)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

VS中动态库的创建和调用

VS中动态库的创建和调用 库 ​ 库是写好的现有的,成熟的,可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。 ​ 库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态…

一键操作完整的部署项目流程

目录 一、常见的搭配 二、完整的部署项目流程具体步骤 2.1、安装jdk 安装jdk : 配置环境: 检查是否成功: 2.2、配置tomcat外部访问 下载解压软件 安装tomcat 测试tomcat安装是否成功 2.3、安装MySQL 安装vcc环境 命令输入步骤 安…

应用在热能表领域中的数字温度传感芯片

热能表,是适用于测量在热交换环路中,被称作载热液体的液体所吸收或转换热能的仪器,它由流量传感器、温度传感器和热能积算仪三部分组成。热量表(热表)又称热能表、热能积算仪,既能测量供热系统的供热量又能…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息,与bridge相比,融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

ES6笔记总结

首先我们需要了解一下什么是 ECMA: ECMA(European Computer Manufacturers Association)中文名称为欧洲计算机制造商协会,这 个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际 什么是 ECMAScr…

美易官方《美股一哥争夺战白热化:微软市值一度超越苹果》

随着科技股的持续走高,美股一哥争夺战也愈发激烈。微软和苹果这两家科技巨头之间的市值争夺战更是吸引了全球市场的关注。上周苹果接连被两家华尔街机构下调评级后,微软的市值已经在逼近苹果,挑战苹果的美股最高市值公司地位。 微软和苹果都…

[深度学习]Open Vocabulary Object Detection 部署开放域目标检测模型使用感受

一、Open Vocabulary Object Detection介绍 Open Vocabulary Object Detection (OpenVOD) 是一种新型的目标检测方法,它使用开放词汇的概念来识别和检测图像中的对象。与传统的目标检测方法相比,OpenVOD具有更高的灵活性和可扩展性,因为它允…

K8S集群重新初始化--详细过程

K8S集群重新初始化 0、当前环境1、master节点1.1、在master节点执行下面reset命令:1.2、手动清除配置信息,这一步很关键:1.3、重新引导集群1.4、创建配置目录,并复制权限配置文件到用户目录下:1.5 查看集群状态1.6 安装…

小红书私信组件功能解读,商家如何使用

今年八月,小红书私信组件上新了两大新功能。新功能的出现,无疑为商家与消费者的沟通建联,提供了新的可能。今天我们来针对小红书私信组件功能解读! 一、小红书私信组件新功能 这次小红书私信组件上新的两大功能分别是,…

Wargames与bash知识10

Wargames与bash知识10 Bandit Level 17 关卡提示: 主目录中有两个文件:passwords.old和passwords.new。下一级的密码在passwords.new中,是在password.old和password.new之间唯一被更改的行 注意:如果你已经解决了这个级别&…

GEE查看SMAP的L3级土壤水分产品并导出为TIFF

SMAP的L3级产品,时间分辨率为每日,空间分辨率为9KM,到2023年12月2日停止提供。 查看逐日的土壤水分变化 // 设置感兴趣区域(Region of Interest) var roi ee.FeatureCollection(projects/a-flyllf0313/assets/dacha…

【Spring Cloud】微服务架构演变及微服务架构介绍

文章目录 系统架构演变单体应用架构垂直应用架构分布式架构SOA 架构微服务架构 微服务架构介绍微服务架构的常见问题微服务架构的常见概念服务治理服务调用服务网关服务容错链路追踪 微服务架构的常见解决方案ServiceCombSpringCloudSpring Cloud Alibaba 总结 欢迎来到阿Q社区…

C++ 类访问修饰符

数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。 一个类可以有多个 public、protected…

探索web技术与低代码开发的融合应用

随着物联网、云计算和人工智能等技术的迅猛发展,现代软件开发正面临着日益增长的需求和复杂性。为了应对这一挑战,一种被称为低代码开发的快速、可视化开发方法逐渐崭露头角。本文将探讨低代码开发与web技术的融合应用,以及这种趋势对软件开发…

答题小程序源码系统:自带流量主广告位+视频激励广告 带完整的代码安装包以及搭建教程

随着互联网的迅速发展,各种应用程序层出不穷,而答题类小程序由于其独特的互动性和吸引力,成为了当前最热门的应用之一。答题小程序源码系统是一款基于微信小程序开发的源代码系统,它具有丰富的功能和灵活的定制性,可以…

git修改最新提交(commit)信息

一、修改最近一次commit信息 1、首先通过git log查看commit信息 2、使用命令git commit --amend进入命令命令模式,按i进入编辑模式,修改好commit信息后按Esc键退出编辑模式,然后输入:wq保存编辑信息(注意使用英文输入法&#xf…

读书分享-《认知觉醒》揭示心智潜能的启迪之作

《认知觉醒》是一部引人入胜的作品,它不仅深入探索了认知科学的最新进展,而且还以独特的视角阐述了如何通过提升认知能力来改善个人生活和工作效率。作者在书中巧妙地将复杂的科学理论转化为易于理解的语言,使得普通读者也能轻松掌握这些概念…

win10在启动游戏时报错,提示“d3dx9_25.dll文件丢失”,怎么办?d3dx9_25.dll丢失如何自动修复

一、d3dx9_25.dll文件是什么? d3dx9_25.dll是DirectX的一部分,DirectX是一种由微软开发的专门处理与多媒体、游戏程序和视频相关的应用程序接口。d3dx9_25.dll文件是DirectX9中一个重要的dll文件,主要负责处理3D图形程序,作用是帮…

Eva.js是什么(互动小游戏开发)

前言 Eva.js 是一个专注于开发互动游戏项目的前端游戏引擎。 易用:Eva.js 提供开箱即用的游戏组件供开发人员立即使用。是的,它简单而优雅! 高性能:Eva.js 由高效的运行时和渲染管道 (Pixi.JS) 提供支持,这使得释放设…