首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Bash:将两个字符串直接拆分成关联数组

在 Bash 脚本中,你可以使用内置的 read 命令和 IFS(内部字段分隔符)来将两个字符串拆分成关联数组。但是,Bash 本身并不直接支持创建真正的关联数组;它只支持索引数组。不过,你可以通过一些技巧来模拟关联数组的行为。

以下是一个示例脚本,它演示了如何将两个字符串拆分成类似关联数组的结构:

代码语言:txt
复制
#!/bin/bash

# 假设我们有两个字符串,每个字符串包含键值对,用空格分隔
keys="key1 key2 key3"
values="value1 value2 value3"

# 声明一个索引数组来存储键
declare -a assoc_array_keys

# 声明一个索引数组来存储值
declare -a assoc_array_values

# 使用 IFS(内部字段分隔符)将字符串拆分成数组
IFS=' ' read -ra keys_array <<< "$keys"
IFS=' ' read -ra values_array <<< "$values"

# 将键和值分别存储到对应的数组中
for i in "${!keys_array[@]}"; do
    assoc_array_keys[$i]="${keys_array[$i]}"
    assoc_array_values[$i]="${values_array[$i]}"
done

# 现在我们可以使用键来访问对应的值
for key in "${assoc_array_keys[@]}"; do
    index=$(printf "%d\n" "${assoc_array_keys[*]}") | grep -nbi "$key" | cut -d: -f1
    echo "The value for '$key' is '${assoc_array_values[$index]}'"
done

这个脚本首先声明了两个索引数组 assoc_array_keysassoc_array_values 来分别存储键和值。然后,它使用 read 命令和 IFS 将输入的字符串拆分成数组。最后,通过遍历键数组并使用 grepcut 命令来找到对应的索引,从而访问值数组中的值。

请注意,这种方法并不是真正的关联数组,因为它依赖于键的顺序和唯一性。如果键不是唯一的或者顺序很重要,这种方法可能不会按预期工作。

在 Bash 4.0 及以上版本中,你可以使用 declare -A 来声明一个真正的关联数组,但是这需要 Bash 版本的支持,并且不能直接从字符串拆分创建。

如果你需要处理更复杂的数据结构,可能需要考虑使用其他工具,如 jq 来处理 JSON 数据,或者编写一个小型的脚本来模拟关联数组的行为。

参考链接:

  • Bash 官方文档:https://www.gnu.org/software/bash/manual/bash.html#Arrays
  • Bash 关联数组教程:https://linuxconfig.org/how-to-use-associative-arrays-in-bash-script
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 数组分成两个数组并最小化数组和的差(状态压缩DP)

    题目 给你一个长度为 2 * n 的整数数组。 你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 。...nums 中每个元素都需要放入两个数组之一。 请你返回 最小 的 数组和之差。 示例 1: 输入:nums = [3,9,7,3] 输出:2 解释:最优分组方案是分成 [3,9] 和 [7,3] 。...数组和之差的绝对值为 abs((3 + 9) - (7 + 3)) = 2 。 示例 2: 输入:nums = [-36,36] 输出:72 解释:最优分组方案是分成 [-36] 和 [36] 。...示例 3: 输入:nums = [2,-1,0,4,-2,-9] 输出:0 解释:最优分组方案是分成 [2,4,-9] 和 [-1,0,-2] 。...解题 数组折半,分别对一半进行状态枚举 枚举一边取的数的个数,左右的满足二进制位个数的状态取出,排序,双指针求解最接近的 时间复杂度 class Solution { public:

    2.4K20

    C#核心概念--装箱和箱(什么是装箱和箱)

    正是通过类型分成值型(value)和引用型(regerencetype),C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char...、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),引用类型包括:类、数组、接口、委托、字符串等。...箱就是一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 这个过程前2句是i装箱,后一句是obj箱!...箱就是(int)obj,obj箱!! 在C#中,类和数组等都归为了引用型的,那么值类型和引用型有什么区别呢?...而对于引用类型,两个变量有可能引用同一对象,因此对一个变量的操作会影响到另一个变量。

    4K21

    shell变量详解

    图片 CHAR1(0x3)=A 从图片可以看出,当我们在脚本中定义变量存值的时候,可以从以下方面看到变化: a、内存占用:如果存的是一个字符则占用1个字节,如果存的是字符串则是字符串的长度加1个字节长度...(\0是一个 特殊字符,代表字符串结束)。...在代码运作的过程中,可能会把某些命令的执行结果保存起来,后续代码需要使用这些结果,就可以直接使用这个变量。...-r 使变量只读 readonly,该变量的值无法改变,并且不能为unset -x 标记变量通过环境导出 export -a 指定为索引数组(普通数组);查看普通数组 -A 指定为关联数组;查看关联数组...运行脚本时: 2) 运行shell脚本程序时,系统创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell, 另一个是系统为运行脚本程序创建的shell。

    58420

    Netty技术知识点总结

    所以 ByteBuf 本质就是一个由不同的索引分别控制读访问和写访问的字节数组。ByteBuf 的数据结构如下所示: ?...最后一部分虚线表示的是该 ByteBuf 最多还能扩容多少容量; ByteBuf 有三种模式: 堆内存模式:分配对象都在 Java 堆上; 优点:由于数据存储在 Jvm 堆中,所以可以快速创建和快速释放,并且提供了数组直接快速访问的方法...; 缺点:每次数据与I/O进行传输时,都需要将数据拷贝到直接缓冲区 直接内存模式:分配对象都在堆外内存上; 优点:使用 Socket 传递数据时性能很好,避免了数据从 JVM 堆内存拷贝到直接缓冲区的过程...; 行包器 LineBasedFrameDecoder: 从字面意思来看,发送端发送数据包的时候,每个数据包之间以换行符作为分隔,接收端通过 LineBasedFrameDecoder 粘过的...ByteBuf 拆分成一个个完整的应用层数据包。

    95111

    Shell基础入门

    就是两个数组拼接成一个数组 语法: 使用 @ 和 # 获取数组所有元素之后进行拼接 arr_new=(${array1[@]} ${array2[@]} ...) arr_new=(${array1...a array 设置为普通索引数组 A Array 设置为key-vajue关联数组 r readonly 变量设置为只读,也可以使用 readonly x exprot 设置变量成为环境变量,也可以使用...: age: 只读变量 #修改失败 实现key-value关联数组变量语法 关联数组也称为 "键值对(key-value)"数组, 键(key)也即字符串形式的数组下标,值(value)也即元素值...-A:创建关联数组 declare -a 关联数组变量名=(值1 值2 ...) declare -a 关联数组变量名=([O]=值1 [1]=值2 ...)...获取指定key的值 ${关联数组变量名[key]} 获取所有值 ${关联数组变量名[*]} ${关联数组变量名[@]} [root@localhost ~]# vim demo10.sh #内容 #!

    2.4K31

    linux: 深入理解bash关联数组

    为了解决这一问题,Bash 4.0 及以上版本引入了关联数组(Associative Arrays),允许我们使用字符串作为键,从而实现类似于其他编程语言中的 Map 或字典的功能。...本文详细介绍 Bash 关联数组的使用方法及其实际应用。 关联数组的声明与初始化 要在 Bash 中使用关联数组,首先需要声明它。可以使用 declare -A 关键字来声明一个关联数组。...访问关联数组的元素 访问关联数组中的元素与访问普通数组类似,只是使用字符串键而不是整数索引。以下是一个访问关联数组元素的示例: bash #!..." 运行上述脚本输出: Name: Alice Age: 28 City: Seattle 遍历关联数组 Bash 提供了一种简单的方法来遍历关联数组的键和值。...通过掌握关联数组的声明、访问、遍历和删除方法,以及其实际应用场景,我们可以编写出更加高效和易读的 Bash 脚本。在日常工作和开发中,合理使用关联数组大大提高我们的工作效率。

    16310

    java_Object类、日期时间类、System类、包装类

    对象内容比较 如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。...arraycopy方法 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :数组中指定的数据拷贝到另一个数组中...src数组元素[1,2,3,4,5] dest数组元素[1,2,3,9,10] */ } } 包装类 Java提供了两个类型系统,基本类型与引用类型...基本类型与字符串之间的转换 基本类型转换String 基本类型直接与””相连接即可;如:34+"" String转换成对应的基本类型 除了Character类之外,其他所有包装类都具有parseXxx...静态方法可以字符串参数转换为对应的基本类型: public static byte parseByte(String s) :字符串参数转换为对应的byte基本类型。

    1.2K20

    从JDK源码中探究Runtime#exec的限制

    在Runtime类中的exec方法存在有多个重载,大致可以分成传入的参数是一个字符串,或者是一个字符串数组进行命令执行。 字符串执行 我们首先来看看字符串作为参数的情况是怎么样的。...也就是使用这个类命令字符串中根据\t\n\r\f等字符来进行分割成一块块的数组,主要的实现方法就是在exec方法中,首先调用StringTokenizer#countTokens来初始化cmdarray...主要是利用skipDelimiters / scanToken这两个方法来进行切片操作的。 之后就是调用nextToken方法来为前面初始化的数组进行赋值操作。...这里获取的是命令字符串的分割之后的第一块,这个就是该命令执行的环境,比如/bin/sh / /bin/bash这些。...,数组方式是直接传入的自己已经分好块的命令数组进行命令执行,Java便不会自动本应该在一起的命令分割开来造成错误。

    61820

    SHELL(bash)脚本编程一:变量

    bash提供一维的索引和关联数组变量,索引数组是以数字为下标的数组关联数组是以字符串为下标的数组(类似其他语言中的map或dict)。...=,关联数组不能省略。...声明/定义及赋值 通常bash的变量是不需要提前声明的,可以直接进行赋值。变量的值均被视为字符串(在一些情况下也可以视为数字)。当对变量有特殊需要时,也可以先声明变量(如前面关联数组的声明)。...,变量name中只能存储数字,如果字符串赋给此变量时,变量的值为0 #如声明一个索引数组 declare -a name_index[=(aa bb cc dd ee)] #如声明一个变量,并将其导出为环境变量.../test.sh 1 2 3 4 5 6 7 8 9 #直接执行脚本,参数列表赋值给特殊变量@ 1 2 3 4 5 6 7 8 9 .

    2.7K40

    二进制炸弹实验binarybomb

    可以看到,代码的意思是数组_array_2464的第[eax]个字节存放到eax里面,再拼接起来,我们可以看到这个数组是一个字符串数组,在看到后面还有一个数组拼接的结果和aGiants数组压栈之后调用了..._strings_not_equal函数,所以我们可以断定这个炸弹的方法就是从_array_2464这个数组中提取“giants”,那位置是15 0 5 11 13 1 。...根据炸弹会爆炸的情况分成3段: ? 第一段的意思是每个数字不能大于6,第二段的意思是这6个组成一个数组的话a[i]不能等于a[i+1],第三段的意思暂时不需要管,后面会说 ?...我们输入1 2 3 4 5 6,很显然这个输入是满足前面两个条件的,所以我们直接看最后一个条件,这里我们看到我输入的6个数,生成了6个节点 ?...可以发现进入secret phase的条件有两个:一个是输入的字符串数目达到6,也就是拆除所有phase之后,另一个是从一个内存中读入一个整数和一个字符串,这个字符串要跟austinpower一样。

    2.1K20

    Linux Shell基础篇三 - 内置命令

    a array,设置为普通索引数组 A Array,设置为key-value关联数组 r readonly,变量设置为只读, 也可以使用readonly x exprot,设置变量成为全局变量,也可以使用...变量默认为字符串类型,可更改为整型declare -i sum=100+300+50 f function,设置为一个函数变量 实现关联数组变量 关联数组也称为”键值对(key-value)“数组,...1 declare -A 关联数组变量名=([字符串key1]=值1 [字符串key2]=值2 ...)...declare也可以用于定义普通索引数组,-a 参数创建普通或索引数组,-A 创建关联数组: declare -a 关联数组变量名=(值1 值2 ...) declare -a 关联数组变量名=([0]..., 关联数组无法使用索引获取,不用declare -A实现的不是关联数组,而是只有最后一个值赋值成功的索引数组

    1.4K30

    PHP核心编程知识点

    十进制转二进制 整数 除二取余法 填充法 小数:乘二取整 十进制转其他进制 整数:除 n 取余 小数:乘 n 取整 八进制、二进制、十六进制直接的互转 二、八之间的互转 八转二:一三(421码)...二转八:三并一 二、十六之间的互转 十六转二:一四 二转十六:四并一 八、十六之间的互转 八转十六:先一三,再四并一 十六转八:先一四,再三并一 3.整型数据 表示形式 十进制 八进制,以...,不区分大小写 在进行逻辑判断的时候,以下的值会当成false进行处理 整数0 浮点数0:0.0 字符串0:’0’ 空字符串:’’ 空类型:NULL 空数组:array() 对象和资源型永远为真!...主要和逗号的区别 在运算之前是两边的操作数都自动转换为字符串类,然后进行横向的“拼接” 5.关系运算符 =和==的区别 ==和===的区别 6.逻辑运算符 逻辑与 && 或者and 逻辑或 ||  或者...数组分类: 键值之间的关系:索引数组关联数组 数组的维度:一维和多维数组 foreach遍历 基本语法 几个细节 数组的指针:reset,next、current、key

    3.4K51

    shell 脚本笔记(入门到进阶)

    7 变量 8 常量 9 基本数据类型(变量值的类型) 10 数组类型 10.1 普通数组 10.2 关联数组(相当于key value) 11变量值操作 11.1获取变量的长度 11.2截取字符串...判断当前用户对文件有没有rwx权限 13.5 赋值 14 命令后台运行 15 if 判断 16 case 17 while 循环 18 for循环 19 函数 1 shell概念 编写shell程序的两个地方...bash直接使用命令 bash 之后查看bash的进程 ps -ef|grep bash 可以看到有很多的bash进程 如何自定义变量 变量的定义就是这么简单,但是如果不遵守变量定义规则...-x ff.sh 注释也展示 bash -vx ff.sh 7 变量 如何自定义变量 变量的定义就是这么简单,但是如果不遵守变量定义规则,就会报错。...先定义一个数组,之后赋值 [root@192 dev]# declare -a arr [root@192 dev]# arr[0]=44 [root@192 dev]# 10.2 关联数组(相当于key

    77530
    领券