Одна и та же версия jq ведет себя по-разному в Ubuntu 16 и Ubuntu 18 - PullRequest
0 голосов
/ 04 октября 2019

У меня есть bash-скрипт с зависимостью JQ (версия jq-1.5-1-a5b5cbe) и он работает по желанию на Ubuntu 18.04.2 LTS (bash версии 4.4.19 (1) -релиз), но он ведет себя по-другому наUbuntu 16.04.3 LTS (выпуск bash версии 4.3.48 (1)).

while read i;do
  echo ${i}
  echo "...."
  done<<<$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')

Я ожидаю, что каждый объект будет напечатан в отдельных строках, так же, как тот, который я запускал в Ubuntu 18,

{"name":"alpha"}
....
{"name":"beta"}
....
{"name":"gama"}
....
{"name":"delta"}
....

Но на Ubuntu 16 я получаю этот вывод,

{"name":"alpha"} {"name":"beta"} {"name":"gama"} {"name":"delta"}
....

Когда я пытаюсь запустить следующий скрипт, он отлично работает на обоих объектах в отдельных строках. Но так как цикл While выполняется в подоболочке, я не могу сохранить состояние переменной, если в ней выполняется какая-либо операция. Так что это нежелательно, так как я хочу выполнить некоторую операцию и сохранить состояние переменной.

jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]' |while read i;do
    echo ${i}
    echo "...."
done

1 Ответ

0 голосов
/ 05 октября 2019

Обновлено в соответствии с рекомендациями @ CharlesDuffy.

while IFS= read -r line; do
  echo "$line"
  echo "..."
done <<< "$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')"

Оригинал

Это связано с разбиением слов в Bash. Вы должны добавить "" явно, чтобы избежать разбиения слов.

while read i; do
  echo ${i}
  echo "...."
  done <<< "$(jq -c '.[]' <<<'[{"name" : "alpha"},{"name" : "beta"},{"name" : "gama"},{"name" : "delta"}]')"

Здесь изменен Bash-string <<< расщепление в 4.4 бета

ThisВ документе подробно описываются изменения между этой версией bash-4.4-beta и предыдущей версией bash-4.4-alpha.

...

z. Bash больше не разделяет расширение here-строк, как всегда говорилось в документации.

...