在彻底搜索在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中运行子脚本。这样,它将从父代的所有变量继承。