Concatenating strings in bash overwrites them

2020-02-05 04:47发布

I'm parsing query results from a mysql command (with the --table parameter)

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

The query is run successfully, and I receive good data.

Then I iterate over this data:

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

The code is more extensive, but this is basically it. Bash sees every space as a separator though, and that's a problem for text fields.

So I just concatenate them. But when I feed bash this data:

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

http://www.test.com

It concatenates it to something like:

pass:test.url.com.com

As if it's not concatenating, but overwriting. Is this maybe some carriage return problem?

标签: bash
4条回答
爷的心禁止访问
2楼-- · 2020-02-05 05:12

Check that you use Unix line endings. Using Windows line endings caused the same behavior for me, overwriting strings.

查看更多
对你真心纯属浪费
3楼-- · 2020-02-05 05:13

Have a look at setting the IFS variable if you are seeing issues with line separators.

Something like

IFS="\n"

Also be careful with += as it can fall back to array manipulation depending on the version of BASH.

查看更多
家丑人穷心不美
4楼-- · 2020-02-05 05:23

I had the same issue with the stderr output retrieved from the curl command. I found that the output contains carriage return that needs to be removed. For the example above this could be done using the tr tool:

for data in $records ;
do
    data=$(echo "$data" | tr -d '\r')
    test+="$data"
done
查看更多
在下西门庆
5楼-- · 2020-02-05 05:28

Make sure you're using Bash 3 or later. The += operator in Bash can be used to manipulate an Array. It will use the current value of the IFS variable to split the tokens and add the value to the array.

Try: test="$test $data" to concatenate the data

查看更多
登录 后发表回答