Shell脚本从数组声明关联变量

时间:2020-04-22 21:18:07

标签: 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"

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]}"

但是我想使用数组而不是文件来实现相同的功能。

3 个答案:

答案 0 :(得分:2)

您可以在调用declare -A之前使用sed重新格式化输入数据:

s='array=Name:"John" ID:"3234" Designation:"Engineer" Age:"32" Phone:"+123 456 789"'

declare -A "newmap=(
$(sed -E 's/" ([[:alpha:]])/" [\1/g; s/:"/]="/g' <<< "[${s#*=}")
)"

然后检查输出:

declare -p newmap

declare -A newmap=([ID]="3234" [Designation]="Engineer" [Age]="32" [Phone]="+123 456 789" [Name]="John" )

答案 1 :(得分:1)

没有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 的版本:

pip install h5py

答案 2 :(得分:1)

使用定义如下的变量 array

$ 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"

然后我们可以将其提供给while循环以填充数组:

$ 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语句:

$ (
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