Bash shell脚本从数组中声明关联变量
我用空格分隔数组键值对Bash shell脚本从数组中声明关联变量,bash,shell,variables,sh,Bash,Shell,Variables,Sh,我用空格分隔数组键值对 array=Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789" 现在我想将上面的数组转换为关联变量,如下所示 declare -A newmap newmap[Name]="John" newmap[ID]="3234" newmap[Designation]="Engineer" newmap[Age]="32" newmap[Phone]="+123 456 789"
array=Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789"
现在我想将上面的数组转换为关联变量,如下所示
declare -A newmap
newmap[Name]="John"
newmap[ID]="3234"
newmap[Designation]="Engineer"
newmap[Age]="32"
newmap[Phone]="+123 456 789"
echo ${newmap[Name]}
echo ${newmap[ID]}
echo ${newmap[Designation]}
echo ${newmap[Age]}
echo ${newmap[Phone]}
我可以使用文件获取给定密钥的值
declare -A arr
while IFS='=' read -r k v; do
arr[$k]=$v;
done < "file.txt"
echo "${arr[name]}"
但是我想使用数组而不是文件来实现相同的功能。在调用declare-a之前,您可以使用sed重新格式化输入数据: 没有评估的版本: 使用定义如下的变量数组:
$ array='Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789"'
注:
假设属性“:”和值之间没有空格
假设属性/值对之间可能存在可变数量的空白
假设所有值都用一对双引号括起来
假设需要解析这个字符串并存储在一个名为newmap的数组中
我们可以使用sed将字符串拆分为单独的行,如下所示:
$ sed 's/" /"\n/g;s/:/ /g' <<< ${array}
Name "John"
ID "3234"
Designation "Engineer"
Age "32"
Phone "+123 456 789"
并应用建议的和稍加修改的echo声明:
$ (
echo "Name - ${newmap[Name]}"
echo "ID - ${newmap[ID]}"
echo "Designation - ${newmap[Designation]}"
echo "Age - ${newmap[Age]}"
echo "Phone - ${newmap[Phone]}"
)
Name - John
ID - 3234
Designation - Engineer
Age - 32
Phone - +123 456 789
您的数组=名称:。。。不是有效的数组定义,因此我们需要更好地描述数据当前的存储方式;如果数组真的是数组,那么typeset-p数组生成什么?到目前为止您尝试了哪些代码请用您尝试过的代码更新问题?另外,你说数组的大小可能不同是什么意思?我更新了问题,并提到了数组长度。但数组不是数组。这只是一个中断的变量赋值,如何定义/创建数组?实际上不需要eval。谢谢
array='Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789"'
declare -A "newmap=($(perl -pe 's/(\w+):"/[\1]="/g' <<< "$array"))"
echo ${newmap[Phone]}
# output : +123 456 789
$ array='Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789"'
$ sed 's/" /"\n/g;s/:/ /g' <<< ${array}
Name "John"
ID "3234"
Designation "Engineer"
Age "32"
Phone "+123 456 789"
$ unset newmap
$ typeset -A newmap
$ while read -r k v
do
newmap[${k}]=${v//\"} # strip off the double quote wrapper
done < <(sed 's/" /"\n/g;s/:/ /g' <<< ${array})
$ typeset -p newmap
declare -A newmap=([ID]="3234" [Name]="John" [Phone]="+123 456 789" [Age]="32" [Designation]="Engineer" )
$ (
echo "Name - ${newmap[Name]}"
echo "ID - ${newmap[ID]}"
echo "Designation - ${newmap[Designation]}"
echo "Age - ${newmap[Age]}"
echo "Phone - ${newmap[Phone]}"
)
Name - John
ID - 3234
Designation - Engineer
Age - 32
Phone - +123 456 789