Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash shell脚本从数组中声明关联变量_Bash_Shell_Variables_Sh - Fatal编程技术网

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