首页 > 系统相关 >[Linux] shell编程之数组 [转载]

[Linux] shell编程之数组 [转载]

时间:2023-11-03 10:34:23浏览次数:58  
标签:info shell array1 编程 echo user 数组 Linux 元素

1 概述

  • 数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素

  • 当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。

2 定义数组

2.1 一维索引数组

方法1

# 定义一个空数组
array=()

# 为数组元素赋值
array1[0]=a
array1[1]=b
array1[2]=c

这会得到一个包含三个元素的数组array1

方法2

array2=(a b c)

元素之间以空格隔开。

2.2 多维数组

数组名[索引1][索引2]=值
或者
数组名[索引1,索引2]=值

2.3 关联数组

关联数组可以使用非数字作为下标,可以是任意字符串

2.3.1 案例:定义一个名为user_info的数组

declare -A user_info
user_info[name]=devops
user_info[age]=18

或者

user_info=([name]=devops [age]=18)

注意:在函数外部定义的关联数组为全局变量,在函数内部定义的关联数组为局部变量

3 操纵数组

3.1 直接获取元素的值及数组的信息

3.1.1 获取单个元素的值


# 获取第一个元素的值
echo ${array1[0]}
> a

# 获取第一个元素的值
echo ${array1[-1]}
> b

3.1.2 获取所有元素的值

echo ${array1[*]} 
> a b c

# 或:  
echo ${array1[@]}

3.1.3 统计数组的长度

echo ${#array1[*]}
> 3

3.1.4 打印数组的下标值

echo ${!array1[@]} 
echo ${!user_info[@]}

3.1.5 删除数组元素和数组

unset array2[2]			# 删除索引数组的第三个元素

unset user_info[age]	# 删除关联数组中索引为age的元素

unset array2			# 删除数组

3.2 循环遍历数组

3.2.1 方法1:for循环直接取值

for i in "${array1[@]}"
do
	echo $i
done

3.2.2 方法2:通过下标取值

for i in ${!array1[@]}
do
	echo ${array1[i]}
done

3.2.3 方法3:C语言风格

for((i=0;i<${#array1[@]};i++))
do
	echo ${array1[i]}
done

4 FAQ

4.1 $*$@的区别?

4.1.1 当直接通过echo获取数组所有元素时:二者等效

4.1.2 而在循环中它们就有区别了

总结:${array1[*]}会将数组元素视为一个整体,而${array1[@]}将所有数组元素视为独立的个体,推荐使用${array1[@]}

X 参考文献

标签:info,shell,array1,编程,echo,user,数组,Linux,元素
From: https://www.cnblogs.com/johnnyzen/p/17807052.html

相关文章

  • linux下安装nginx
    下载nginxwgethttps://nginx.org/download/nginx-1.25.3.tar.gzyum安装依赖包yum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel解压tar-zxvfnginx-1.22.0.tar.gz配置当前nginxcdnginx-1.22.0./configure--prefix=/usr/local/nginx......
  • Linux 实验
    知识补充框架设计Linux操作可以分为本地操作和网络操作,操作对象主要是文件和目录,根据上述分类设计框架如下本地操作基础指令:系统一般内置目录目录切换:cd增删改查mkdirrmdir权限管理:chmodchmod命令的具体用法如下:chmod[选项]模式文件其中,模式是......
  • Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
    一、前言在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家......
  • Linux中使用Docker容器安装mysql,无法直接使用mysql命令?
    1.问题如果你在Docker容器中运行MySQL,你不能在宿主主机上使用mysql--version命令来检查MySQL版本,因为MySQL客户端工具在宿主主机上未安装。2.解释2.1方法一要查看容器内MySQL的版本,你需要进入到容器中执行相应的命令。以下是一种方法:dockerexec-itmysqlmys......
  • Java网络编程实现一(服务器)对多(客户端)
    使用多线程+网络编程实现一个服务器对多个客户端在该程序中用到的知识点java的BIOServerSocket和Socket网络编程多线程的知识(个人认为重要)实现的思路服务器端(使用多个线程)在客户端需要有一个集合来存储已经连接上的客户端,如果客户端断开连接则需要从集合中删除创建一......
  • JUC并发编程学习笔记(四)8锁现象
    8锁现象八锁->就是关于锁的八个问题锁是什么,如何判断锁的是谁对象、class模板深刻理解锁锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。同步方法的调用者是两个不同的实例时,互不相关。静态同步方法(s......
  • 【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext'
    问题描述AzureWebJob执行Powershell脚本报错 Select-AzContext:Theterm'Select-AzContext'isnotrecognizedasthenameofacmdlet,function,scriptfile,oroperableprogram.Checkthespellingofthename,orifapathwasincluded,verifythatthepa......
  • java 网络编程之传输文件
    需要建两个类,分别作为服务器(接收文件)和客户端(发送文件) 1.服务器类:1package菜鸟教程.网络编程.网络编程之传输文件;23importjava.io.*;4importjava.net.InetAddress;5importjava.net.ServerSocket;6importjava.net.Socket;78/**9*服......
  • java网络编程与多线程
      一、Java 网络编程网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。java.net包中提供了两种常见的网络......
  • Linux 网络配置以及软件包管理
    frompixiv网络连接配置的方法命令行进行配置nmclidevicestatus查看当前主机设备的活动情况我们来看点我们关系的吧!DEVICE中的下面的名字是什么鬼?这是设备的命名规则,对应网络连接来说,这个设备的名称就是网络接口的名称numcli是什么命令?一般的操作命令......