在bash 3中创建关联数组

前端之家收集整理的这篇文章主要介绍了在bash 3中创建关联数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在彻底搜索在bash中创建一个关联数组的方式之后,我发现declare -A数组将会做到这一点。但是问题是,只有bash版本4和bash版本的服务器在我们的系统中是3.2.16。

如何在bash 3中实现某种类型的关联数组类似的黑客?这些值将被传递给一个脚本

ARG=array[key];

./script.sh ${ARG}

编辑:我知道我可以在awk或其他工具中执行此操作,但是我想要解决的场景需要严格的bash。

Bash 3没有关联数组,因此您将不得不为了您的目的使用其他语言功能。请注意,即使在bash 4下,您编写的代码不会执行您声明的代码:./script.sh $ {ARG}不会将关联数组传递给子脚本,因为$ {ARG}将扩展为无ARG是一个关联数组。您不能将关联数组传递给子进程,无论如何都需要进行编码。

您需要在父脚本和子脚本之间定义一些参数传递协议。一个常见的方法是传递参数,格式为key = value。这假设字符=不出现在键中。

您还需要弄清楚如何在父脚本和子脚本中表示关联数组。他们不需要使用相同的表示。

表示关联数组的常用方法是为每个元素使用单独的变量,并具有通用的命名前缀。这要求密钥名称仅由ASCII字母(两种情况),数字和下划线组成。例如,代替$ {myarray [key]},写$ {myarray__key}。如果密钥在运行时确定,则需要先进行一次扩展:而不是$ {myarray [$ key]},写入

n=myarray__${key}; echo ${!n}

对于作业,请使用printf -v。注意printf使用指定值的%s格式。不要写printf -v“myarray __ $ {key}”%s“$ value”,因为它会将$ value视为一种格式,并对其执行printf%扩展。

printf -v "myarray__${key}" %s "$value"

如果您需要将一个如此表示的关联数组传递给具有key = value参数表示形式的子进程,则可以使用$ {!myarray __ *}枚举名称以myarray__开头的所有变量。

args=()
for k in ${!myarray__*}; do
  n=$k
  args+=("$k=${!n}")
done

在子进程中,要将格式为key = value的参数转换为带前缀的变量:

for x; do
  if [[ $x != *=* ]]; then echo 1>&2 "KEY=VALUE expected,but got $x"; exit 120; fi
  printf -v "myarray__${x%%=*}" %s "${x#*=}"
done

顺便说一下,你确定这是你需要的吗?而不是从另一个bash脚本调用bash脚本,您可能希望在子shell中运行子脚本。这样,它将从父代的所有变量继承。

猜你在找的Bash相关文章