como arredondar uma matriz associativa bash para um arquivo de texto?

7

Eu quero memorizar um array associativo entre diferentes execuções de script. O que eu tenho até agora é que, dado um arquivo de texto contendo um par chave / valor:

(
[james]=bond
)

É um script para carregá-lo em uma matriz associativa, adicioná-lo a ele e, em seguida, ecoá-lo de uma maneira que possa ser redirecionada para um segundo arquivo:

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

então posso executá-lo como:

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

Dando

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

No entanto, parece muito desajeitado. Existe uma maneira mais limpa de fazer isso?

    
por simbo1905 10.06.2014 / 14:52

1 resposta

7

Em bash , declare -p pode ser usado para despejar a definição de uma variável como código shell pronto para ser interpretado, para que você possa fazer atualizações no arquivo com:

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

Um script para mostrar o conteúdo do arquivo seria:

#! /bin/bash -
file=${1?}; shift
declare -A row
source -- "$file"
for i in "${!row[@]}"
do
  echo "key  : $i"
  echo "value: ${row[$i]}"
done
    
por 10.06.2014 / 15:53

Tags