如果我有一个变量,其数据如下:
Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205
我正在尝试将我的$ var转换为预期的关联数组,如下所示。
var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap
$ varMap[Audit]=9201
$ varMap[Management]=9202
$ varMap[Inventory]=9203
$ varMap[Source]=9204
$ varMap[Flemingo]=9205
是否有任何有效的方法可以将上面的$ var变量转换为一个关联数组,以便我可以根据其余代码中的键执行查找?
您可以尝试以下操作:
var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap="($(sed 's/\([^[:blank:]]\+\)[[:blank:]]\+\([^[:blank:]]\+\)/\[\1]=\2/g' <<< "$var"))"
# test
for i in "${!varMap[@]}"; do
echo "$i => ${varMap[$i]}"
done
结果:
Audit => 9201
Flemingo => 9205
Management => 9202
Source => 9204
Inventory => 9203
像这样,简单,易读且有效:)
# declare a simple string
var='Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205'
# declare a simple array, using word spliting
arr=( $var )
# declare an associative array
declare -A varmap
# iterating over array to feed varmap associative array
for ((i=0; i<${#arr[@]}; i+=2)) {
varmap[${arr[i]}]=${arr[i+1]}
}
# test of one of a key
echo ${varmap[Management]}
9202
[请您试一下。这将创建动态的自动化脚本,该脚本将具有自动化的数组创建功能,并且还将打印其键和值。 (这些是OP自己在后期提供的测试样本)
var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
echo "$var" |
awk -v s1="\"" -v array_name="arrvar" '
BEGIN{
print "declare -A " array_name
}
{
for(i=1;i<=NF;i+=2){
print array_name "["$i"]="$(i+1)
}
}
END{
print "echo keys, values here for array.." ORS \
"for key in " s1 "${!"array_name"[@]}" s1 "; do echo " s1 "$key => ${"array_name"[$key]}" s1 "; done"
}
' > file.ksh;chmod 755 file.ksh;./file.ksh
下面的shell脚本将由上述命令创建:
cat file.ksh
declare -A arrvar
arrvar[Audit]=9201
arrvar[Management]=9202
arrvar[Inventory]=9203
arrvar[Source]=9204
arrvar[Flemingo]=9205
echo keys, values here for array..
for key in "${!arrvar[@]}"; do echo "$key => ${arrvar[$key]}"; done
逻辑解释:]
var
)。vararr
的数组。file.ksh
的脚本,您可以根据需要对其进行更改。awk
代码在做什么,先读取var
(shell变量),然后读取其打印命令,以创建由您提供的命名数组。它还正在打印该数组的键和值。注意:它只编写命令来执行此操作,到目前为止尚未执行它们。file.ksh
的脚本文件中(您可以保留所需的任何名称)。file.ksh
权限并运行它,它实际上将创建一个由您提供的名为的数组,并且还会打印带有索引的值。var="Audit 9201 Management 9202 Inventory 9203 Source 9204 Flemingo 9205"
declare -A varMap
while [ "$var" ]; do
read key value var <<< "$var"
varMap[$key]=$value
done