【问题标题】:Concatenating strings in bash overwrites them在 bash 中连接字符串会覆盖它们
【发布时间】:2012-09-10 20:18:50
【问题描述】:

我正在解析来自 mysql 命令的查询结果(带有 --table 参数)

local records=`echo "${query}" | $MYSQL -u $MyUSER -h $MyHOST -p$MyPASS --table`

查询运行成功,我收到了良好的数据。

然后我遍历这个数据:

for data in $records ;
do
    test+=$data
done

代码更广泛,但基本上就是这样。 不过,Bash 将每个空格都视为分隔符,这对文本字段来说是个问题。

所以我只是将它们连接起来。但是当我输入 bash 这些数据时:

*URL*
host:
test.url.com
pass:
anothertest

http://www.test.com

它将它连接到类似的东西:

pass:test.url.com.com

好像它不是连接,而是覆盖。 这可能是一些回车问题吗?

【问题讨论】:

  • 听起来您可能会以某种方式在字符串中嵌入回车符,但我不知道您发布的内容来自何处。尝试使用例如打印各种字符串printf "test=%q\n" "$test" -- bash 的 %q 格式将打印带引号的格式字符串,这使得识别回车等内容变得更加容易。尝试每次循环打印"$data",然后在最后打印"$test",看看它们的样子。
  • 我遇到了同样的问题,对我来说是windows的回车。改成Linux结尾后,就成功了。

标签: bash


【解决方案1】:

我对从curl 命令检索到的 stderr 输出也有同样的问题。我发现输出包含需要删除的回车。对于上面的示例,这可以使用tr 工具来完成:

for data in $records ;
do
    data=$(echo "$data" | tr -d '\r')
    test+="$data"
done

【讨论】:

    【解决方案2】:

    检查您是否使用 Unix 行尾。使用 Windows 行尾对我来说会导致相同的行为,覆盖字符串。

    【讨论】:

      【解决方案3】:

      确保您使用的是 Bash 3 或更高版本。 Bash 中的+= 运算符可用于操作数组。它将使用IFS 变量的当前值来拆分标记并将值添加到数组中。

      尝试: test="$test $data" 连接数据

      【讨论】:

        【解决方案4】:

        如果您发现行分隔符有问题,请查看设置 IFS variable

        类似

        IFS="\n"
        

        还要小心+=,因为它可能会根据 BASH 的版本退回到数组操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-08
          • 2018-02-26
          • 1970-01-01
          • 2019-02-02
          • 2015-01-04
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多