我从命令行工具返回一些数据,并希望用数据填充关联数组。我可以改变返回数据的格式,但它必须如何对关联数组?
content="[key1]=val1 [key2]=val2" # How should this be formatted?
declare -A hashTable
hashTable=($content) # How to set it?
declare -p hashTable
答案 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]}
,因为密钥和值都不会进行分词或路径名扩展。如果你愿意的话,引用它们并没有什么坏处。)