jq
имеет параметр форматирования оболочки: @sh
.
Вы можете использовать следующее для форматирования данных json в качестве параметров оболочки:
cat data.json | jq '. | map([.original_name, .changed_name])' | jq @sh
Вывод будет выглядеть так:
"'pdf_convert' 'pdf_convert_1'"
"'video_encode' 'video_encode_1'",
"'video_transcode' 'video_transcode_1'"
Чтобы обработать каждую строку, нам нужно сделать пару вещей:
- Установите цикл for в bash для чтения всей строки, а не остановки на первом пробеле (поведение по умолчанию).
- Удалите двойные кавычки из каждой строки, чтобы каждое значение можно было передать в качестве параметра функции, которая обрабатывает каждую строку.
Чтобы прочитать всю строку на каждой итерации цикла for bash, установите переменную IFS
, как описано в этот ответ.
Чтобы избавиться от двойных кавычек, мы запустим его через интерпретатор оболочки bash, используя xargs
:
stripped=$(echo $original | xargs echo)
Собрав все вместе, мы имеем:
#!/bin/bash
function processRow() {
original_name=$1
changed_name=$2
# TODO
}
IFS=$'\n' # Each iteration of the for loop should read until we find an end-of-line
for row in $(cat data.json | jq '. | map([.original_name, .changed_name])' | jq @sh)
do
# Run the row through the shell interpreter to remove enclosing double-quotes
stripped=$(echo $row | xargs echo)
# Call our function to process the row
# eval must be used to interpret the spaces in $stripped as separating arguments
eval processRow $stripped
done
unset IFS # Return IFS to its original value
person
Mashmagar
schedule
12.02.2019
jq
есть командаforeach
, вы пробовали это? - person Kevin   schedule 27.11.2015