Linux shell的数组详解

2023-05-16

Linux shell的数组详解

  • 前提
  • 变量
  • 数组
    • 数组声明
      • 声明索引数组
      • 声明关联数组
    • 数组赋值
    • 数组引用
    • 数组中常用的变量
    • 数组中的其它操作
  • 示例

前提

程序是指 指令 + 数据 的组合。

  • 指令:bash脚本中的代码(函数、调用的命令等)
  • 数据:变量、数组、文件等

变量

变量 是 存储单个元素的内存空间。

数组

数组 是 存储多个元素的连续的内存空间。

数组格式:
	# 数组名[数组索引]
	
	# 数组名:整个数组只有一个名字;
	# 数组索引:编号从0开始;0 1 2 3 4 5

数组引用:
	# ${ARRAY_NAME[INDEX]} 
	# 注意:一定要带花括号,如果不带花括号的话,默认只会引用数组的第一个元素,如下:
		# $ARRAY_NAMR[INDEX]    只会引用数组的第一个数

示例:

[root@LeeMumu ~]# Lover[0]=JiaoTang
[root@LeeMumu ~]# Lover[1]=NEO
[root@LeeMumu ~]# Lover[2]=Pangpang
[root@LeeMumu ~]# echo ${Lover[0]}
JiaoTang
[root@LeeMumu ~]# echo ${Lover[1]}
NEO
[root@LeeMumu ~]# echo $Lover[1]
JiaoTang[1]
[root@LeeMumu ~]# echo $Lover
JiaoTang

数组声明

声明数组时可以声明索引数组或者关联数组,但是只有bash-4及以后的版本,支持自定义索引格式,而不仅仅是 0,1,2, …数字格式。

# declare  -a  NAME         # 声明索引数组
# declare  -A  NAME         # 声明关联数组

查看bash版本:

[root@LeeMumu ~]# rpm -q bash
bash-4.2.46-31.el7.x86_64

声明索引数组

[root@LeeMumu ~]# Lover[0]=JiaoTang
[root@LeeMumu ~]# Lover[1]=NEO
[root@LeeMumu ~]# Lover[2]=Pangpang
[root@LeeMumu ~]# echo ${Lover[0]}
JiaoTang
[root@LeeMumu ~]# echo ${Lover[1]}
NEO

声明关联数组

**注意:**关联数组一定要事先声明才行,不然会按照索引数组进行执行。如下两个示例。

[root@LeeMumu ~]# declare -A LOVER
[root@LeeMumu ~]# LOVER[NEO]=NEO
[root@LeeMumu ~]# LOVER[JiaoTang]=JiaoTang
[root@LeeMumu ~]# echo LOVER[NEO]
LOVER[NEO]
[root@LeeMumu ~]# echo ${LOVER[NEO]}
NEO
[root@LeeMumu ~]# echo ${LOVER[JiaoTang]}
JiaoTang
[root@LeeMumu ~]# Lover[JL]=NEO
[root@LeeMumu ~]# Lover[JC]=JiaoTang
[root@LeeMumu ~]# echo ${Lover[JL]}
JiaoTang
[root@LeeMumu ~]# echo ${Lover[JC]}
JiaoTang

数组赋值

数组中元素的赋值方式主要有几个方式:

  1. 一次只能赋值一个元素

    # ARRAY_NAME[INDEX]=value
    
  2. 一次赋值全部元素

    # ARRAY_NAME=("VAL1"  "VAL2"  "VAL3"  ...)
    
  3. 只赋值特定元素

    # ARRAY_NAME=([0]="VAL1"  [3]="VAL4" ...)
    
  4. 交互式赋值

    # read  -a  ARRAY_NAME
    

备注:bash支持稀疏格式的数组

数组引用

引用数组中的元素:${ARRAY_NAME[INDEX]}
# 注意:引用时,只给数组名,表示引用下标为0的元素

数组中常用的变量

数组中常用的变量如下:

${#ARRAY_NAME[*]}         # 数组中元素的个数
${#ARRAY_NAME[@]}         # 数组中元素的个数

${ARRAY_NAME[*]}          # 引用数组中的所有元素
${ARRAY_NAME[@]}          # 引用数组中的所有元素
${#ARRAY_NAME}            # 数组中下标为 0 的字符个数

数组切片引用:

命令格式:
${ARRAY_NAME[@]:offset:number}
	# offset:要路过的元素个数
	# number:要取出的元素个数;省略number时,表示取偏移量之后的所有元素

示例1:

[root@LeeMumu ~]# echo ${#Lover[*]}
3
[root@LeeMumu ~]# echo ${#Lover[@]}
3
[root@LeeMumu ~]# echo ${Lover[*]}
JiaoTang NEO Pangpang
[root@LeeMumu ~]# echo ${#Lover}
8
[root@LeeMumu ~]# echo ${Lover[0]}
JiaoTang

示例2:

# 把/etc/目录下以p或者P开头的文件名赋值到files数组中
[root@LeeMumu ~]# ls -d /etc/[pP]*
/etc/pam.d   /etc/passwd-  /etc/pki       /etc/pm        /etc/popt.d   /etc/ppp             /etc/printcap  /etc/profile.d  /etc/python
/etc/passwd  /etc/pkcs11   /etc/plymouth  /etc/polkit-1  /etc/postfix  /etc/prelink.conf.d  /etc/profile   /etc/protocols
[root@LeeMumu ~]# files=(/etc/[Pp]*)
[root@LeeMumu ~]# echo ${files[*]}
/etc/pam.d /etc/passwd /etc/passwd- /etc/pkcs11 /etc/pki /etc/plymouth /etc/pm /etc/polkit-1 /etc/popt.d /etc/postfix /etc/ppp /etc/prelink.conf.d /etc/printcap /etc/profile /etc/profile.d /etc/protocols /etc/python
[root@LeeMumu ~]# echo ${files[@]:2:3}
/etc/passwd- /etc/pkcs11 /etc/pki
[root@LeeMumu ~]# echo ${files[@]:5}
/etc/plymouth /etc/pm /etc/polkit-1 /etc/popt.d /etc/postfix /etc/ppp /etc/prelink.conf.d /etc/printcap /etc/profile /etc/profile.d /etc/protocols /etc/python
[root@LeeMumu ~]# echo ${#files[*]}
17
[root@LeeMumu ~]# echo ${#files[@]}
17

数组中的其它操作

# 向非稀疏格式数组中追加元素
	ARRAY_NAME[${#ARRAY_NAME[*]}]=
			
# 删除数组中的某元素
	unset  ARRAY[INDEX]
			
# 关联数组
	declare  -A  ARRAY_NAME

# 关联数组赋值
	ARRAY_NAME=([index_name1]="value1"  [index_name2]="value2" ...)

示例

  1. 生成10个随机数,并找出其中的最大值和最小值。
[root@LeeMumu ~]# bash sort10.sh 
28039
15431
2321
28443
4768
19176
30361
18180
935
1574
The max of the ten random integers is : 30361 .
The min of the ten random integers is : 935 .
[root@LeeMumu ~]# cat sort10.sh 
#!/bin/bash
#
declare -a rand
declare -i max=0
declare -i min=0

for i in {0..9}; do
	rand[$i]=$RANDOM
	echo ${rand[$i]}
	[ ${rand[$i]} -gt $max ] && max=${rand[$i]}
done

for j in {1..8}; do
	[ ${rand[$j]} -lt ${rand[$j-1]} ] && min=${rand[$j]}
done

echo "The max of the ten random integers is : $max ."
echo "The min of the ten random integers is : $min ."
  1. 定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件;统计其下标为偶数的文件中的行数之和。
[root@LeeMumu ~]# bash fileseven.sh
The even file /var/log/boot.log has 157 Lines .
The even file /var/log/vmware-network.2.log has 21 Lines .
The even file /var/log/vmware-network.4.log has 146 Lines .
The even file /var/log/vmware-network.6.log has 16 Lines .
The even file /var/log/vmware-network.8.log has 16 Lines .
The even file /var/log/vmware-network.log has 16 Lines .
The even file /var/log/yum.log has 114 Lines .
The even files have toutally 486 Lines .
[root@LeeMumu ~]# cat fileseven.sh
#!/bin/bash
#
declare -a files           
files=(/var/log/*.log)           # 后续()会进行命令行展开,生成文件名称序列

declare -i lines=0

for i in $(seq 0 $[${#files[*]}-1]); do
	if [ $[$i%2] -eq 0 ]; then
		echo "The even file ${files[$i]} has $(wc -l ${files[$i]} | cut -d' ' -f1) Lines ."
		let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)
	fi
done

echo "The even files have toutally $lines Lines ."
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux shell的数组详解 的相关文章

  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • sh / Bash shell 脚本中 !# (bang-pound) 的含义是什么?

    我想了解这个 Scala 脚本是如何工作的 usr bin env bash exec scala 0 object HelloWorld def main args Array String println Hello world arg
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 如何允许应用程序声明“https”方案 URI? (即如何从 https URL 打开桌面应用程序?)

    目前我正在尝试为 OAuth 2 0 授权流程创建一个客户端 实际上是一个本机应用程序 并且在规范中就在这儿 https www rfc editor org rfc rfc8252 section 7 2据说有 3 种方法来处理重定向 U
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 在 shell 脚本中将一个子字符串替换为另一个字符串

    我有 我爱苏子并结婚 我想将 苏子 更改为 萨拉 firstString I love Suzi and Marry secondString Sara 期望的结果 firstString I love Sara and Marry 要更换
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其

随机推荐

  • 安装vue-element-admin报错git clone --mirror -q git://github.com/adobe-webplatform/eve.git C:\Users\Admin

    问题描述 vue element admin项目 执行安装操作时 xff1a 安装依赖 npm install 建议不要直接使用cnpm安装依赖 xff0c 会出现bug xff0c 可以通过如下操作解决npm下载速度慢的问题 由于淘宝 N
  • 添加启动页

    添加启动页 2021 5 7 实验内容 1 为学号后一位同学编写一个简单app 新建一个emptyactivity 在layout的activity main xml中添加如下代码 span class token number 1 spa
  • Python求最大公约数和最小公倍数

    使用辗转相除法求得最大公约数 xff0c 再利用最大公约数求得最小公倍数 辗转相除法求最大公约数 def gcd num1 num2 if num1 num2 61 61 0 return num2 else num1 num2 61 nu
  • matlab实现梯度下降法

    前记 xff1a 大三上学期学了 运筹学 课程 xff0c 里面包含了许多算法和模型 模型就是线性规划及线性规划的对偶理论 xff0c 单纯形法以及它的实际应用 xff1b 整数规划及其解法 xff08 分支定界法 割平面法匈牙利算法 xf
  • 互斥锁、条件变量、信号量浅析

    互斥锁 条件变量 信号量浅析 互斥锁与条件变量 条件变量是为了保证同步 条件变量用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过条件变量告诉别的线程 xff0c 别的线程再进行某些动作 xff08 大家都在semtake的
  • Linux中的tty、pts、pty等概念辨析

    Linux中的tty pts pty等概念辨析 基本概念 tty pty pts ptmx tty xff08 终端设备的统称 xff09 xff1a tty一词源于Teletypes xff0c 或teletypewriters xff0
  • 树莓派4B (aarch64) 安装PyTorch 1.8 的可行方案

    树莓派4B aarch64 安装PyTorch 1 8 的可行方案 最终可行方案 试了一堆方案 xff08 源码编译 Fast ai的安装文件等 xff09 之后 xff0c 终于找到一个可行的方案 是在 PyTorch 官方讨论社区的一个
  • Nvidia CUDA初级教程1 CPU体系架构综述

    Nvidia CUDA初级教程1 CPU体系架构综述 视频 xff1a https www bilibili com video BV1kx411m7Fk p 61 2 讲师 xff1a 周斌 本节内容 xff1a 了解现代CPU的架构和性
  • 解决VNC远程连接树莓派,窗口显示不全的问题

    1 vnc连接 xff0c sudo raspi config中7 A5选分辨率就好 或2 通过SSH命令行的方式连接树莓派 xff0c 在命令行输入 xff1a vncserver geometry 1080x1024
  • qt官网下载指导(新手易犯错误)

    一 获取资源 注意这里不要直接百度qt的官网 xff0c 如果直接百度下载会让你注册一个qt的账号 xff0c 并且一般没人下载最新版的qt6 当然也可以下载旧的版本 xff0c 但是由于本人比较愚笨 xff0c 还没有在官网找到qt旧版本
  • AI智能呼叫中心系统,主要应用场景有哪些?

    互联网智能时代 xff0c 销售人员不再每天拨打数百个电话 xff0c 当前呼叫中心电话系统被企业常用在电销行业 金融行业 保险 贷款催收行业等外呼销售行业 由传统的呼叫中心基础上不断的进行升级和改善 xff0c 逐渐演变为人工智能电话外呼
  • ROS:geometry_msgs中 Point32 , Point ,PointStamped 的定义和转换

    ROS geometry msgs中Point32 Point PointStamped 的定义和转换 Point32和Point的定义Point32和Point的转换PointStamped 的定义和转换 本文所用ROS为kinetic版
  • ROS:回调函数不执行

    最近在写一个接收图片消息的节点时 xff0c 遇到了两次回调函数不调用的情况 xff0c 记录一下 循环中有continue被跳过了 具体代码如下 xff1a while ros ok if mat data 61 61 nullptr s
  • Python猜拳游戏

    关键点在于 user input 43 1 3与computer input的值进行比较 xff0c 这样就省掉了对于边界值0和2的单独判断 xff0c 简化了代码 from random import choice def finger
  • ROS:节点发布消息无对应话题名称

    最近在写一个发布里程的节点的时候遇到了 xff0c 发布了消息 xff0c 在ros却没有对应话题情况 通过rostopic list 和 rosnode info 节点名 命令查看 xff0c 均没有对应话题 xff0c 大致代码如下 x
  • 【python安全攻防】python简易端口扫描器

    文章目录 socket套接字optparse模块socket解析主机进行连接获取bannerthreading多线程端口扫描器python nmap端口扫描 对自己看python绝技的一次学习记录 socket套接字 与TCP端口进行交互
  • ROS中geometry_msgs常用消息类型

    官方文档 xff1a geometry msgs Msg Srv Documentation geometry msgs里面所有的消息数据类型 xff1a 节点之间仅支持使用消息通讯 Accel AccelStamped AccelWith
  • 【docker ros】docker 开启自启运行容器中的程序

    前言 xff1a 使用docker大规模部署应用 xff0c 而又需要开机自启 xff0c 自动启动容器中的程序 xff0c 这里以docker ros为例子 xff0c 使用systemctl服务 xff0c 结合shell脚本 xff0
  • 网络协议与网络编程(双电脑串口通讯)

    C C 43 43 网络编程 双电脑串口通讯 在阅读本文前 请确保先查看这篇文章 xff0c 学习有关TCP网编与单电脑信息传输实践 文章目录 C C 43 43 网络编程 双电脑串口通讯 1 让两台电脑连接同一个局域网2 查询IP地址3
  • Linux shell的数组详解

    Linux shell的数组详解 前提变量数组数组声明声明索引数组声明关联数组 数组赋值数组引用数组中常用的变量数组中的其它操作 示例 前提 程序是指 指令 43 数据 的组合 指令 xff1a bash脚本中的代码 xff08 函数 调用