【问题标题】:Bash when i try to apped to a string its overwrite当我尝试附加到一个字符串时,它会被覆盖
【发布时间】:2020-06-09 03:58:18
【问题描述】:

我在windows下的(git-)bash中运行如下函数:

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

当我将这些全部放入新闻文件时,它也可以按预期工作。所以我认为在调用这个函数之前的数千行中出现了问题。任何想法,可能是什么原因导致这种行为?

问候

戴夫

【问题讨论】:

    标签: string bash concatenation concat git-bash


    【解决方案1】:

    这不是你应该如何构建命令的方式,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
    

    【讨论】:

      【解决方案2】:

      如果函数被调用

      config_get_container_values proj gitea
      

      它产生“预期”的输出。如果用

      调用它
      config_get_container_values proj $'gitea\r'
      

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

      问题的一个可能原因是容器名称 (gitea) 是从具有 Windows/DOS 行结尾 (CR-LF) 的文件中读取的。诸如此类的问题很常见。请参阅Stack Overflow 'bash' Info page 的“在询问有问题的代码之前”部分中的第一个问题(“检查您的脚本或数据是否具有 DOS 样式的行尾字符”)。

      【讨论】:

        猜你喜欢
        • 2020-11-13
        • 1970-01-01
        • 2016-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 2017-10-19
        相关资源
        最近更新 更多