bash从socket中追加字符串

时间:2016-04-20 09:05:42

标签: bash

lines=""
for (( i=0; i < $lineNum; i++ )); do
  read -t 1 -u $redis_socket line
  lines+=$line
done
echo "$lines"

例如,假设套接字中的每一行都是aaabbbbccccc我希望最终输出类似于aaabbbbccccc

但是我得到了aaabc,我在这里做错了吗?

我在其他问题上尝试了很多替代方案,但没有什么可行的。

示例输出行如下所示

redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
slave0:ip=127.0.0.1,port=6379,state=online,offset=549974442474,lag=0
....
db1:keys=4190,expires=0,avg_ttl=0

,最终输出为

db1:keys=4190,expires=0,avg_ttl=0tl=1200913396e,offset=549974442474,lag=0

1 个答案:

答案 0 :(得分:1)

正如评论中所见,问题在于你得到的输出回车。

由于$line包含一个回车符,给定一个值,说lines+=$line结果是$lines$line的交集,而不是$line 1}}附加到$lines

line       lines
XXX        XXX
YYYY       XXXY
ZZ         XXXY

举例:

line  -> redis_git_dirty:0
lines -> redis_git_dirty:0

line  -> slave0:ip=127.0.0.1,port=6379,state=online,offset=549974442474,lag=0
lines -> redis_git_dirty:0.1,port=6379,state=online,offset=549974442474,lag=0
#        ^^^^^^^^^^^^^^^^^
#           intersection

line  -> db1:keys=4190,expires=0,avg_ttl=0
lines -> db1:keys=4190,expires=0,avg_ttl=0te=online,offset=549974442474,lag=0
#        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#           intersection

所以解决办法是事先删除这个回车符:

line=$(echo "line" | tr -d '\r')
lines+="$line"