Первоначальный код не работал в первую очередь
# THIS IS BROKEN
json_list='["First Item", "Second Item", "Third Item"]'
for itemValue in $(echo "$json_list" | jq --compact-output '.[]'); do
echo "Got an item: <$itemValue>"
done
испускает:
Got an item: <"First>
Got an item: <Item">
Got an item: <"Second>
Got an item: <Item">
Got an item: <"Third>
Got an item: <Item">
Очевидно, это неверно: он разделен на пробелы, расширен на глобусы (a *
, окруженный пробелом внутри строки, будет заменен списком имен файлов в текущем каталоге) и содержит буквальные кавычки, в которых вместо приведенных в JSON указаны syntacti c.
Правильное выполнение с jq
Требуется лучший выбор разделителя, и A while read
L oop
# THIS WORKS
json_list='["First Item", "Second Item", "Third Item"]'
while IFS= read -r -d '' itemValue; do
echo "Got an item: <$itemValue>"
done < <(jq -j '.[] | (., "\u0000")' <<<"$json_list")
... с выходным сигналом:
Got an item: <First Item>
Got an item: <Second Item>
Got an item: <Third Item>
Тот же самый ответ может быть легко перенесен на Python
json_to_nullsep_py=$(cat <<'EOF'
import json
import sys
for item in json.load(sys.stdin):
sys.stdout.write(item)
sys.stdout.write('\x00')
EOF
)
json_to_nullsep() {
python -c "$json_to_nullsep_py" "$@"
}
while IFS= read -r -d '' itemValue; do
echo "Got an item: <$itemValue>"
done < <(json_to_nullsep <<<"$json_list")
... аналогично правильно выдает:
Got an item: <First Item>
Got an item: <Second Item>
Got an item: <Third Item>