Вы теряете кавычки из-за расширения оболочки при подстановке команд, вам просто нужно снова заключить это в кавычки. Рекомендуется использовать форму $()
вместо обратных кавычек. Это делает ваш код более читабельным.
eval./test.py "$(find./testdata -type f -printf "\"%p\" ")"
Обновлен :, теперь он ведет себя как другие примеры, я поставил eval впереди, это приведет к правильному расширению/цитированию для вас, чтобы получить отдельные аргументы в кавычках для python.
Вопрос двоякий:
Вы передаете JSON jq
с помощью --arg
, который ожидает текст. Это означает, что jq
будет JSON -кодировать данный текст в строку. У утилиты jq
есть отдельная опция --argjson
для случаев, когда передаваемые данные являются документом JSON.
В самом общем случае вы не хотите внедрять переменные оболочки в документ JSON без кодирования их содержимого. Вы делаете это, передавая данные переменной в jq
с помощью --arg
или используя какой-либо другой инструмент (, например jo
), который ожидает ввода не -JSON и создает вывод JSON.
[]
без кавычек, что заставит оболочку жаловаться, если она имеетfailglob
(или эквивалентную, например, nomatch
в опции оболочки zsh
). Оболочка zsh
имеет параметр оболочки nomatch
, установленный по умолчанию. Вашу проблему лучше всего решить, используя jq
для добавления данных непосредственно в существующий документ:
jq \
--arg block_id "$block_id" \
--arg block_parent_id "$block_parent_id" \
--arg current_index 0 \
--arg child_sum 0 \
--arg block_cidr "" \
--arg block_size "" \
--arg child_cidr "" \
--arg child_size "" \
'. += [ $ARGS.named |.subnets = $ARGS.positional ]' \
--args \
<<<"$parent"
В приведенной выше команде я создаю объект, который добавляю в существующий список в $parent
, используя $ARGS.named
для каждой пары простых (скалярных )ключей -значений. Значение $ARGS.named
— это объект с ключами и значениями, взятыми из опций --arg
и их значений. Затем я добавляю массив subnets
с помощью $ARGS.positional
. Это значение является массивом значений после --args
в командной строке. Параметр --args
должен быть последним параметром в командной строке, а в приведенной выше команде список пуст.
Если вы хотите создать объект, который вы добавляете отдельно:
to_add=$(
jq -n \
--arg block_id "$block_id" \
--arg block_parent_id "$block_parent_id" \
--arg current_index 0 \
--arg child_sum 0 \
--arg block_cidr "" \
--arg block_size "" \
--arg child_cidr "" \
--arg child_size "" \
'[ $ARGS.named |.subnets = $ARGS.positional ]' \
--args
)
jq --argjson block "$to_add" '. += $block' <<<"$parent"