Bash когда я пытаюсь добавить в строку ее перезапись - PullRequest
1 голос
/ 25 февраля 2020

я запускаю следующую функцию в (git -) bash в windows:

function config_get_container_values() {

local project_name=$1
local container_name=$2

#local container_name="gitea"

echo "###"
buildcmd="jq -r \".containers[]."
echo "$buildcmd"
buildcmd="${buildcmd}${container_name}"
echo "$buildcmd"
buildcmd="${buildcmd}foobar"
echo "$buildcmd"
echo "###"

}

Вывод этого следующий. Однако после использования переменной для расширения строки он начинает перезаписывать $ buildcmd. Я пробовал это также со всем в одной строке с помощью команды добавления (= +). Каждый раз один и тот же результат.

###
jq -r ".containers[].
jq -r ".containers[].gitea
foobar".containers[].gitea
###

Действительно странная вещь: когда я включаю строку local container_name="gitea", все работает, как ожидалось. Вывод:

###
jq -r ".containers[].
jq -r ".containers[].gitea
jq -r ".containers[].giteafoobar
###

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

С уважением

Дейв

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Это не то, как вы должны создавать команду, кроме концовок строки DOS. Используйте --arg, чтобы передать имя в фильтр как переменную. Например,

config_get_container_values() {

  local project_name=$1
  local container_name=$2

  jq -r  --arg n "$container_name " '.containers[][$n+"foobar"]'
}

config_get_container foo gitea < some.json
0 голосов
/ 25 февраля 2020

Если функция вызывается с

config_get_container_values proj gitea

, она выдает «ожидаемый» результат. Если он вызывается с

config_get_container_values proj $'gitea\r'

, он производит вывод, который выглядит как первый пример вывода. $'gitea\r' раскрывается в строку, состоящую из 'gitea', за которой следует Символ возврата каретки (CR).

Одной из возможных причин проблемы является имя контейнера (gitea ) был прочитан из файла с окончанием строки Windows / DOS (CR-LF). Подобные проблемы встречаются часто. См. Первый вопрос («Проверьте, есть ли в вашем сценарии или данных символы конца строки в стиле DOS») в разделе «Перед тем, как спрашивать о проблемном c коде» на информационной странице Stack Overflow 'bash' .

...