Создание массива из JSON данных о расположении файлов / каталогов; bash не регистрируется, если элемент является каталогом - PullRequest
0 голосов
/ 09 марта 2020

У меня есть файл JSON, в котором хранятся такие данные: "path/to/git/directory/location": "path/to/local/location". Минимальный пример файла может быть таким:

{
    "${HOME}/dotfiles/.bashrc": "${HOME}/.bashrc",
    "${HOME}/dotfiles/.atom/": "${HOME}/.atom/"
}

У меня есть скрипт, который систематически читает вышеуказанное JSON (называемое locations.json) и создает массив, а затем печатает элементы массива, которые каталоги. MWE:

#!/usr/bin/env bash

unset sysarray
declare -A sysarray

while IFS=: read -r field data
do
    sysarray["${field}"]="${data}"
done <<< $(sed  '/^[{}]$/d;s/\s*"/"/g;s/,$//' locations.json)

for file in "${sysarray[@]}"
do
    if [ -d "${file}" ] 
    then
        echo "${file}"
    fi
done

Однако этот каталог не печатается (т. Е. $ {HOME} /. Atom). Я не понимаю, почему это происходит, потому что

  • Я пытался создать массив вручную (т.е. не из JSON) и проверить, являются ли его элементы каталогами, и что работает отлично.

  • Я попытался отобразить каждый элемент в массиве во временный файл и прочитать каждую строку в файле, чтобы увидеть, был ли это продукт того, как информация хранилась в массиве, но не повезло.

  • Я пытался добавить | tr -d "[:blank:]" | tr -d '\"' после использования sed на JSON (чтобы узнать, был ли это продукт непреднамеренного пробела или кавычек), но не повезло.

  • Я попытался просто запустить [ -d "${HOME}/.atom/" ] && echo '.atom is a directory', и это работает (так что это действительно каталог). Я не уверен, что может быть причиной этого.

Помощь в этом была бы отличной!

1 Ответ

0 голосов
/ 09 марта 2020

Вы можете использовать инструмент для правильной обработки json файлов, который будет иметь дело с любыми действительными json.

#!/usr/bin/env bash

unset sysarray
declare -A sysarray

while IFS="=" read -r field data
do
    sysarray["${field}"]=$(eval echo "${data}")
done <<< $(jq -r 'keys[] as $k | "\($k)=\(.[$k])"' locations.json)

for file in "${sysarray[@]}"
do
    if [ -d "${file}" ] 
    then
        echo "${file}"
    fi
done

Другая проблема заключается в том, что после правильной обработки дополнительных знаков кавычек мы иметь литерал ${HOME}, который не раскрывается. Единственное решение, которое я нашел, - это использование eval для принудительного расширения. Это не самый лучший способ, но сейчас я не могу найти лучшего решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...