Bash 当我尝试附加到一个字符串时它会被覆盖

Bash when i try to apped to a string its overwrite

i 运行 windows 下 (git-)bash 中的以下函数:

function config_get_container_values() {

local project_name=
local container_name=

#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
###

当我将这些全部放入新闻文件时,它也按预期工作。所以我认为在调用此函数之前,数千行出现了问题。知道这种行为的原因是什么吗?

此致

戴夫

如果函数被调用

config_get_container_values proj gitea

它产生 "expected" 输出。如果用

调用
config_get_container_values proj $'gitea\r'

它产生的输出看起来像第一个输出示例。 $'gitea\r' 扩展为由 'gitea' 后跟 Carriage return (CR) 字符组成的字符串。

问题的一个可能原因是容器名称 (gitea) 是从具有 Windows/DOS 行结尾 (CR-LF) 的文件中读取的。诸如此类的问题很常见。请参阅 Stack Overflow 'bash' Info page 的 "Before asking about problematic code" 部分中的第一个问题 ("Check whether your script or data has DOS style end-of-line characters")。

这不是您构建命令的方式,DOS 行结尾放在一边。使用 --arg 将名称作为变量传递到过滤器中。例如,

config_get_container_values() {

  local project_name=
  local container_name=

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

config_get_container foo gitea < some.json