Bash:从变量设置关联数组

时间:2018-02-28 12:54:52

标签: bash

我从命令行工具返回一些数据,并希望用数据填充关联数组。我可以改变返回数据的格式,但它必须如何对关联数组?

content="[key1]=val1 [key2]=val2" # How should this be formatted?

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

declare -p hashTable

3 个答案:

答案 0 :(得分:0)

如果你掌握content并理解好bash解析,例如不是来自exernal输入

eval "hashTable=($content)"

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

content=');echo hey;x=('

可能更容易拆分content

hashTable=()
tmp=$content
while [[ $tmp = *\[* ]] && tmp=${tmp#*\[} || tmp=; [[ $tmp ]]; do
    cur=${tmp%%\[*};
    val=${cur#*\]=};
    hashTable[${cur%%\]=*}]=${val%${val##*[![:space:]]}}
done

答案 1 :(得分:0)

如果您接受格式化第一个命令的输出,就像这样

key1=value1 key2=value2

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

#!/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

答案 2 :(得分:0)

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

$ 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" )
bash的{​​{1}}选项需要{p> -d 4.4。在早期的4.x版本中,您可以使用带有嵌入换行符的字符串,但这会阻止您自己的键或值包含换行符。

(请注意,在readArray的分配中,您可以安全地保留hashTable${foo[i]},因为密钥和值都不会进行分词或路径名扩展。如果你愿意的话,引用它们并没有什么坏处。)