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

sim*_*905 12 bash

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

(
[james]=bond
)
Run Code Online (Sandbox Code Playgroud)

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

#!/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 ")"
Run Code Online (Sandbox Code Playgroud)

然后我可以将它运行为:

./arrays.sh file1 honey rider > file2 ; mv file2 file1
Run Code Online (Sandbox Code Playgroud)

给予

(
[james]=bond
[honey]=rider
)
Run Code Online (Sandbox Code Playgroud)

然而它看起来非常笨重。有没有更干净的方法来做到这一点?

Sté*_*las 11

bash,declare -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"
Run Code Online (Sandbox Code Playgroud)

请注意,在相同的语言环境(至少是相同的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
Run Code Online (Sandbox Code Playgroud)

  • @ec2011,使用最新版本的`bash`(比编写答案时可用的版本更新),您将能够使用`readarray -td '' array` 将 NUL 分隔的记录读入 *regular* 数组然后将其转换为关联数组。 (2认同)