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