Как считать файл свойств в ассоциативный массив?

  1. Для Innodb вы можете просто добавить CONFIG_mysql_dump_single_transaction = 'yes' в свой файл conf.

  2. Для механизма MyISAM вам нужно будет добавить --skip-add-locks в файл automysqlbackup. найдите функцию parse_configuration и добавьте значение массива, как указано ниже.

Я убедился, что он отлично работает.

Измените

parse_configuration () {
    # OPT string for use with mysqldump ( see man mysqldump )
    opt=( '--quote-names' '--opt')

на

parse_configuration () {
    # OPT string for use with mysqldump ( see man mysqldump )
    opt=( '--quote-names' '--opt' '--skip-add-locks' '--skip-add-drop-table')
6
20.07.2016, 12:04
4 ответа
declare -A properties
function readPopertyFile
{
    while read line || [[ -n $line ]]; do
        key=`echo $line | cut -s -d'=' -f1`
        if [ -n "$key" ]; then
            value=`echo $line | cut -d'=' -f2-`
            properties["$key"]="$value"
        fi
    done < $1
}

Использование:

readPopertyFile "file.properties"

Считывает свойства в переменную ассоциативного массива с именем properties .

* Работает в bash. Не знаю про другие снаряды.

* Не обрабатывает многострочные свойства.

2
27.01.2020, 20:24

Для наиболее распространенного подмножества этого формата данных можно использовать короткую функцию, используя расширение переменных bash и regexp-сопоставление.

Примечание: Эта функция ожидает, что строки будут в формате ^key = value$, или ^#.*$ и ^!.*$ для комментариев. Адаптируйте код или обработайте данные иначе

$ cat /tmp/propdata 
k1 = v1
# A comment
k2 = v2and some s=t=u=f=f
! Another comment
k3 = v3

$ unset DATA
$ declare -A DATA

$ props(){ while read line || [[ -n $line ]]; do
[[ "$line" =~ ^#|^! ]] && continue;
if [[ "${line% =*}" ]]; then DATA[${line% =*}]="${line#*= }" ; fi ;
done < $1 ; }

$ props /tmp/propdata

$ echo "${DATA[k3]}"
v3
$ echo "${DATA[k2]}"
v2and some s=t=u=f=f

Edit: Обновлено для обрезания пробелов вокруг "=" для ключа и значения

Edit2: Теперь фильтрует и комментарии.

4
27.01.2020, 20:24

Используйте настоящий синтаксический анализатор, такой как perl модуль Config :: Properties . Я бы написал весь сценарий на perl , но если вам нужно использовать bash , вы можете сделать что-то вроде:

typeset -A props
while IFS= read -rd '' key && IFS= read -rd '' value; do
  props[$key]=$value
done < <(
  perl -MConfig::Properties -l0 -e '
   $p = Config::Properties->new();
   $p->load(STDIN);
   print for $p->properties' < file.properties
)

(также работает с zsh ) .

Реализация полного синтаксического анализатора в bash потребует много работы и потребует повторного изобретения колеса. Вы можете реализовать хорошее подмножество с помощью простого цикла while read , хотя, поскольку встроенная функция read ожидает входной формат, очень похожий на эти файлы свойств:

typeset -A props
while IFS=$':= \t' read key value; do
  [[ $key = [#!]* ]] || [[ $key = "" ]] || props[$key]=$value
done < file.properties

(также работает с ksh93 и zsh , две другие борноподобные оболочки, поддерживающие ассоциативные массивы).

Это обрабатывает:

  • prop = value
  • prop: value
  • prop value
  • комментарии в начале строки (! и # с необязательные начальные пробелы)
  • экранирование обратной косой черты (как в foo \: \: bar = value для ключей, содержащих разделители, либо foo = \ bar или пароль_с \\ обратной косой чертой) -и = равно в вашем примере).
  • продолжение строки с обратной косой чертой

Однако, если мы проверим соответствие спецификации

  • Это не обрабатывает \ n , \ r , \ uXXXX ... последовательности
  • LF - единственный распознанный разделитель строк (не CR или CRLF).
  • FF не распознается как пробел (мы не можем просто добавить его в $ IFS , поскольку \ f не является символом пробела IFS).
  • для ввода типа foo: bar = , который сохраняет bar в $ {props [foo]} вместо bar = ] ( foo: bar: baz: все же в порядке). Это проблема только в том случае, если значение свойства содержит один (неэкранированный) разделитель (: , необязательно окруженный символами SPC / TAB, = , необязательно окруженный символами SPC / TAB или последовательность из одного или более символов SPC / TAB) и находится в конце.
  • он рассматривает как строки комментариев, начинающиеся с \! или \ # . Проблема только в свойствах, имя которых начинается с ! или # .
  • в

     prop = 1 \ {1}} 2 \ 
    3 
     

    мы получаем 1 2 3 вместо 123 : начальные пробелы в строках продолжения не игнорируются, как и должно быть.

6
27.01.2020, 20:24

Вот руководство по Bash4+

#!/usr/bin/env bash

declare -A properties

# Read with:
# IFS (Field Separator) =
# -d (Record separator) newline
# first field before separator as k (key)
# second field after separator and reminder of record as v (value)
while IFS='=' read -d $'\n' -r k v; do
  # Skip lines starting with sharp
  # or lines containing only space or empty lines
  [[ "$k" =~ ^([[:space:]]*|[[:space:]]*#.*)$ ]] && continue
  # Store key value into assoc array
  properties[$k]="$v"
  # stdin the properties file
done < file.properties

# display the array for testing
typeset -p properties

file.properties:

# comment
a=value-a
b=http://prefix.suffix:8080/?key=value
c=password_with\\backslash-and=equals

d e=the d e value
  # comment

Вывод этого скрипта из предоставленной выборки данных:

declare -A properties=(["d e"]="the d e value" [c]="password_with\\\\backslash-and=equals" [b]="http://prefix.suffix:8080/?key=value" [a]="value-a" )
5
27.01.2020, 20:24

Теги

Похожие вопросы