我正在获取从命令行工具返回的一些数据,并希望用这些数据填充一个关联数组。我可以更改返回数据的格式,但它必须如何转换为关联数组?
content="[key1]=val1 [key2]=val2" # How should this be formatted?
declare -A hashTable
hashTable=($content) # How to set it?
declare -p hashTable发布于 2018-02-28 22:05:16
如果您精通content并很好地理解bash解析,例如,不是来自外部输入
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发布于 2018-02-28 22:50:29
如果您接受格式化第一个命令的输出,如下所示
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发布于 2018-03-01 00:33:36
执行此操作的最佳方法(需要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" )readArray的-d选项需要bash 4.4。在早期的4.x版本中,您可以使用带有嵌入换行符的字符串,但这会将键或值本身排除在包含换行符的范围之外。
(请注意,在对hashTable的赋值中,可以安全地保留${foo[i]}和${foo[i+1]}的无引号,因为键和值都不会进行单词拆分或路径名扩展。不过,如果您愿意,引用它们也无伤大雅。)
https://stackoverflow.com/questions/49030109
复制相似问题