如何将bash关联数组往返于文本文件?


9

我想记住不同脚本运行之间的关联数组。到目前为止,我得到的是给定一个包含一个键/值对的文本文件:

(
[james]=bond
)

是一个脚本,用于将其加载到关联数组中,添加到该数组中,然后以可以重定向到第二个文件的方式将其回显:

#!/bin/bash
file=`cat $1`
key=$2
value=$3
declare -A row="$file"
row[$key]=$value
echo "("
for server in "${!row[@]}"
    do echo "[$server]=${row[$server]}"; done
echo ")"

然后我可以将其运行为:

./arrays.sh file1 honey rider > file2 ; mv file2 file1

给予

(
[james]=bond
[honey]=rider
)

然而,这似乎很笨拙。有没有更清洁的方法可以做到这一点?


4
declare -p hash > file保存hash关联数组。source file恢复。
斯特凡Chazelas

2
它可能应该是arrays.bash...
mikeserv 2014年

Answers:


10

在中bashdeclare -p可用于将变量的定义转储为易于解释的shell代码,因此您可以使用以下命令对文件进行更新:

#! /bin/bash -
file=${1?}; shift
declare -A row
source -- "$file" || exit
while [ "$#" -ge 2 ]; do
  row[$1]=$2
  shift 2
done
declare -p row > "$file"

请注意,在相同的语言环境(至少是同一LC_CTYPE类别)中生成和获取文件很重要。

显示文件内容的脚本为:

#! /bin/bash -
file=${1?}; shift
declare -A row
source -- "$file"
for i in "${!row[@]}"
do
  printf 'key  : %s\n' "$i"
  printf 'value: %s\n' "${row[$i]}"
done

自我认证参数的万岁!但是更具体的错误字符串会更有用吗?
mikeserv 2014年

@mikeserv,当然​​,但这超出了答案的范围。一定要添加适当的语法检查。可能还需要检查文件名后面是否有偶数个参数(或使用奇数单个参数作为删除单个元素的一种方式)。
斯特凡Chazelas

我不知道...也许不要求我编辑...您不应该邀请吸血鬼来...但是我想这已经完成了。
mikeserv 2014年

哦对不起。我想我不该从字面上理解吗?我确实按照您的要求进行了操作,并使其变得更强大而又不复杂。
mikeserv

2
@ ec2011,具有最新版本bash(比编写答案时可用的版本更高),您将可以用来将以readarray -td '' arrayNUL分隔的记录读取到常规数组中,然后将其转换为关联数组。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.