shell 二维数组

2023-11-15

这次写脚本时用到了bash shell数组,当初做法是配置文件里面写成数组形式A=(element1 element2 element3 .... element4),然后一个脚本读取这个配置文件,于是稍微总结了一下数组的使用方法:

Bash shell中使用数组变量 , 其赋值/定义有两种 :

1. name=(value1 ... valuen) 此时下标从0开始,也可以这样做:name=([1]=a [2]=b [0]=c)
2. name[index] =value 
3. declare -a arrayname=(element1 element2 element3)
4. declare -a Unix=('Debian' 'Red Hat' 'Red hat' 'SUSE' 'Fedora') # 如果单个元素包括括号

操作方式:

1. 数组长度:${#arrary[@]}

2. 遍历数组:for i in ${array[@]} ; do ; echo $i  或者如下:
先得到这个数组的有效索引:${!array[@]},然后利用 array[$index]来操作。例如:A={[1]=2 [3]=4 [4]=5}
for idx in ${!A[@]} ; do echo ${idx}_${A[$idx]} ; done
需要注意的是 ${A[*]}与${A[@]}的区别:
当两者都没有用""括起来的时候也就是${A[@]} ${A[*]}的效果是一样的,但是有了""
"${A[@]}" :最大限度的保持原意,比如A[1]='a   b' 那么这样输出的也是a  b这是一个整体,而如果没有"",这输出的是a b这是两个元素!
"${A[*]}":所有的元素都变成一个字符串了,也就是一个整体 【Linux公社 http://www.linuxidc.com 】

3. 取某一个元素:array[index],如果单个元素里面包含多个空格,那么保留这多个空格需要"",比如echo "${array[2]}"

4. 使一个字符串变bash shell 数组,可以放在文件里面,然后source file,但是这个file里面的内容的是:array=(value1 value2 ... valuen)这种形式,还有一种最简单的做法:array=(`cat filename`)(此时filename里面就不是array=这种形式了,而是直接value1 value2 value3...) 或者array=(content)

5. 清除一个数组,清0, unset arrayname

6. 连接两个数组,array=("${array1[@]}" "${array2[@]}"),用""的目的是防止元素本身包含空格,前面已经提到过

7. 复制一个数组,跟上面连接一样array=("${array1[@]}")

8. 数组添加元素,原理也跟上面一样array=("${array1[@]}" "xx")

9. 提取数组的元素,${array[@]:3:2} 从第三个位置开始,取两个元素。如果是针对一个元素提取(相当于substring)${array[index]:start:len}

貌似bash shell中没有多维数组,那么该怎么实现呢?我自己想了一个比较笨的方法,这个方法也得对数据的组织形式有要去:
普通的我们一维数组是这样的:
a=(1 2 3 4 5 6)
假设需要一个二维数组:
b=(1 2 3,
4 5 6,
7 8 9)
当然这种写法是不对的,只是便于理解而已。此时我们可以再构造二维数组之前写一个这样的二维数组:
a=('1 2 3'  '4 5 6'  '7 8 9')
然后我们可以利用
for  i  in "${a[@]}" ; do 
echo $i #这一步就得到了每一行,而如果我们需要二维数组,那么可以这样做 
done

for i in "${a[@]}" ; do
b=($i) #此时b就相当于二维数组里面的一维数组了,然后可以再次遍历
for j in "${b[@]}"; do
#do someting
done
done

其实我们有时候完全可以这样做:构造成这样:a=(1 2 3 4 5 6 7 8 9),然后操作的时候利用第i行j列的元素等于i*len+j,len是数组的第二维度大小,这样做有时候更简单,但是就必须得控制一下边界了,比如3*3的数组,你可能初始化只给出8个元素。

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

shell 二维数组 的相关文章

  • 检查帐号是否为数字时出现语法错误

    if account nr 0 9 from account nr 0 9 这是为了检查帐号是否为数字 我收到语法错误 这个问题的早期版本缺少之间的空格if and 实际代码具有所需的空间 它显示以下错误消息 syntax error ac
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何正确使用fork、exec、wait

    我正在编写的 shell 需要执行用户提供给它的程序 这是我的程序的非常简短的简化版本 int main pid t pid getpid this is the parents pid char user input NULL size
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 每次重新运行终端时,我都必须输入 export PATH=~/anaconda/bin:"$PATH"

    我已经安装了 Anaconda for Mac 但出现了一些问题 当我输入命令时which conda or which ipython I get conda not found and ipython not find 然后我找到这个命
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 测试 bash shell 脚本[重复]

    这个问题在这里已经有答案了 有人可以解释一下如何测试 bash shell 脚本吗 例如 我有一个 sh 文件 其中包含此代码 bin sh for file in txt do mv file basename file txt doc

随机推荐

  • 读完这个我懂了JNDI

    JNDI 是什么 JNDI是 Java 命名与目录接口 Java Naming and Directory Interface 在J2EE规范中是重要的规范之一 不少专家认为 没有透彻理解JNDI的意义和作用 就没有真正掌握J2EE特别是E
  • 分区表正被其它程序独占访问_硬盘主引导记录MBR程序代码分析——小白到高手的进阶...

    MBR是什么 MBR 全称为Master Boot Record 即硬盘的主引导记录 为了便于理解 一般将MBR分为广义和狭义两种 广义的MBR包含整个扇区 引导程序 分区表及分隔标识 也就是上面所说的主引导记录 而狭义的MBR仅指引导程序
  • java安全沙箱机制介绍

    java安全沙箱机制介绍 组成Java沙箱的基本组件如下 类加载体系结构 class文件检验器 内置于Java虚拟机 及语言 的安全特性 安全管理器及Java API Java安全模型的前三个部分 类加载体系结构 class文件检验器 Ja
  • 综合指数:拉氏指数和派氏指数

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 拉式公式 报告期p1 基期q0之和 除以 基期p0 基期q0 p0 q0是假定的 可以这么理解 如果按照基期的价格 那么现在有多少销售额呢 派式公式
  • 08-3_Qt 5.9 C++开发指南_Graphics View绘图架构

    文章目录 1 场景 视图与图形项 1 1 场景 1 2 视图 1 3 图形项 2 Graphics View 的坐标系统 2 1 图形项坐标 2 2 视图坐标 2 3 场景坐标 2 4 坐标映射 3 Graphics View 相关的类 3
  • 常用的测试平台

    测试用例管理与bug管理平台 测试用例管理平台 jira 推荐方案 定制性很强 redmine 推荐方案 开源 活跃 定制性很强 Testlink 流行的测试用例管理平台 体验不是很好 其它 tapd 云效 禅道 gitlab 在线协作文档
  • 巧用符号链接移动文件夹位置

    有些时候我们可能因为系统或者某些软件的缓存占得比较多 想把他们从C盘移动到其他地方 但是软件本身并没有提供修改缓存文件夹的功能 这下应该怎么办呢 其实还真有一个好办法可以完美解决 这就是今天要为大家介绍的符号链接 符号链接这个名词经常使用L
  • Django中解决redis-py versions 3.2.0 or later. You have 2.10.6版本问题

    问题描述 在django项目中 添加异步任务 跑服务时遇到redis py版本问题 如下截图 提示版本较低 解决 从4 3 0到4 4 0的Kombu更新停止了对redis py v2 10 6的支持 因此迫使我们升级redis py版本
  • Python基础知识(注释、变量、常量)

    注释 是对代码进行解释和说明 注释是给人看的 机器是不运行的 Python中注释 单行注释 注释内容 多行注释 注释内容 或者 注释内容 变量 可以发生改变的一个量 变量是用来区分不同数据的 可以指向一个内存空间 帮我们存储一些数据 变量的
  • pip安装opencv-python不成功

    一个比较笨但还算有效的方法 如果你的python版本较低 如现在2023 07 04使用python3 6环境 使用pip默认安装会是最新的4 8 0 7版本 但事实上这个版本不支持py3 6环境 所以你需要去这里查支持py3 6的最近的一
  • Unity在development模式下的一个坑

    最近发现unity生成的包在Nexus上如果打开带Input控件的界面时 关闭屏幕再打开 则永远无法显示输入法界面了 一开始还以为是unity自己本身的bug 后来发现release版本并无这个问题 于是弄了个最简单的测试版本分别打了 两个
  • day01-编程题

    选择题 题目1 单选 下列属于是计算机硬件的是 D 选项 A QQ B 微信 C 飞秋 D CPU 题目2 单选 下列可以保证java程序跨平台运行的是 A 选项 A JVM java虚拟机 B Windows系统 C Linux系统 D
  • JAVA第三方技术---Elasticsearch---与JDK版本对应关系

    JAVA第三方技术 Elasticsearch 与JDK版本对应关系 目录 文章目录 1 对应关系表 2 Elastic support地址 3 JVM support地址 后记 内容 1 对应关系表 Elasticsearch and J
  • windows 下配置redis 让其他主机访问本机的redis数据

    在做一个分布式项目的时候 redis不使用 ip 127 0 0 1 启动的时候一直报错 即使使用本机的地址也会报错 然后自己去网上找了一些资料都没有解决 网上一些资料又说改配置文件 把 redis windows conf 里面的 pro
  • 10分钟内用Ezo和Python构建以太坊Oracle

    上一篇 我写了用Web3 js构建以太坊Oracle 这个练习给了我一些新的Web3 js 1 0版本知识 许多新的好东西可供选择而且使用它实现一个简单的oracle非常容易 但是 显然必须有更好的方法 Instant Oracles 只需
  • SQL语句中的日期计算

    SQL语句中的日期计算 1 本月的第一天 SELECT DATEADD mm DATEDIFF mm 0 getdate 0 2 本月的最后一天 SELECT dateadd ms 3 DATEADD mm DATEDIFF m 0 get
  • hotmail手机端_hotmail邮箱登陆手机版 参见http://help.

    讲到邮箱 我们很多人都知道 有人问hotmail邮箱 还有人问hotmail邮箱登陆手机版 这到底是咋回事 实际上hotmail邮箱呢 小编为大家带来hotmail邮箱登陆手机版 希望你喜欢 hotmail邮箱登陆手机版 您好 你手机如果是
  • C#软件外包开发流程

    C 是一种由微软开发的多范式编程语言 常用于开发各种类型的应用程序 从桌面应用程序到移动应用程序和Web应用程序 下面和大家分享 C 编程学习流程 希望对大家有所帮助 北京木奇移动技术有限公司 专业的软件外包开发公司 欢迎交流合作 1 基础
  • 前缀、中缀、后缀表达式(逆波兰表达式)

    中缀表达式 简介 中缀表达式就是常见的运算表达式 如 3 4 5 6 前缀表达式 简介 前缀表达式又称波兰式 前缀表达式的运算符位于操作数之前 比如 3 4 5 6 前缀表达式的计算机求值 从右至左扫描表达式 遇到数字时 将数字压入堆栈 遇
  • shell 二维数组

    这次写脚本时用到了bash shell数组 当初做法是配置文件里面写成数组形式A element1 element2 element3 element4 然后一个脚本读取这个配置文件 于是稍微总结了一下数组的使用方法 Bash shell中