bash連想配列をテキストファイルに往復するには?

bash連想配列をテキストファイルに往復するには?

異なるスクリプト実行間の連想配列を覚えておきたい。これまでに得たのは、キーと値のペアを含むテキストファイルがあることです。

(
[james]=bond
)

連想配列にロードして追加し、2番目のファイルにリダイレクトできるように再エコーするスクリプト。

#!/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
)

ところで、とても大きく見えますね。これを行うよりクリーンな方法はありますか?

答え1

Inは、変数定義を解釈可能なシェルコードにダンプするために使用できるため、次のようにファイルを更新できますbashdeclare -p

#! /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

関連情報