首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:从变量设置关联数组

Bash:从变量设置关联数组
EN

Stack Overflow用户
提问于 2018-02-28 20:54:52
回答 3查看 76关注 0票数 0

我正在获取从命令行工具返回的一些数据,并希望用这些数据填充一个关联数组。我可以更改返回数据的格式,但它必须如何转换为关联数组?

代码语言:javascript
复制
content="[key1]=val1 [key2]=val2" # How should this be formatted?

declare -A hashTable
hashTable=($content) # How to set it?

declare -p hashTable
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-28 22:05:16

如果您精通content并很好地理解bash解析,例如,不是来自外部输入

代码语言:javascript
复制
eval "hashTable=($content)"

否则,您必须解析它以确保没有注入(因为eval将数据重新解释为代码,bash表达式),假设内容包含echo作为示例

代码语言:javascript
复制
content=');echo hey;x=('

也许拆分content更容易:

代码语言:javascript
复制
hashTable=()
tmp=$content
while [[ $tmp = *\[* ]] && tmp=${tmp#*\[} || tmp=; [[ $tmp ]]; do
    cur=${tmp%%\[*};
    val=${cur#*\]=};
    hashTable[${cur%%\]=*}]=${val%${val##*[![:space:]]}}
done
票数 0
EN

Stack Overflow用户

发布于 2018-02-28 22:50:29

如果您接受格式化第一个命令的输出,如下所示

代码语言:javascript
复制
key1=value1 key2=value2

如果value2中没有空格和'=',那么您可以尝试以下代码:

代码语言:javascript
复制
#!/bin/bash
content="key1=val1 key2=val2"   

declare -A hashTable

for pair in $content ; do 
  key=${pair%=*}        # take the part of the string $pair before '='
  value=${pair/#*=/}    # take the part of the string $pair after '='
  hashTable[$key]=$value
done

for K in "${!hashTable[@]}";  do echo hashTable\[$K\]=${hashTable[$K]}; done
票数 0
EN

Stack Overflow用户

发布于 2018-03-01 00:33:36

执行此操作的最佳方法(需要bash 4.4或更高版本)是让命令返回一个交替使用键和值的字符串,每个键和值都以空字符结尾。然后可以使用readArray将其解析为索引数组,然后从索引数组构建关联数组。

代码语言:javascript
复制
$ readArray -t -d '' foo < <(printf 'key1\0value1\0key2\0value2\0')
$ declare -p foo
declare -a foo=([0]="key1" [1]="value1" [2]="key2" [3]="value2")
$ for ((i=0; i < ${#foo[@]}; i+=2)); do
>  hashTable[${foo[i]}]=${foo[i+1]}
> done
$ declare -p hashTable
declare -A hashTable=([key2]="value2" [key1]="value1" )

readArray-d选项需要bash 4.4。在早期的4.x版本中,您可以使用带有嵌入换行符的字符串,但这会将键或值本身排除在包含换行符的范围之外。

(请注意,在对hashTable的赋值中,可以安全地保留${foo[i]}${foo[i+1]}的无引号,因为键和值都不会进行单词拆分或路径名扩展。不过,如果您愿意,引用它们也无伤大雅。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49030109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档