使用多个列和空格读取MySQL结果集

使用多个列和空格读取MySQL结果集,mysql,bash,Mysql,Bash,假设我有一个MySQL表test,它看起来像: +----+---------------------+ | id | value | +----+---------------------+ | 1 | Hello World | | 2 | Foo Bar | | 3 | Goodbye Cruel World | +----+---------------------+ 1 : Hello 2 : Foo 3 :

假设我有一个MySQL表
test
,它看起来像:

+----+---------------------+
| id |     value           |
+----+---------------------+
| 1  | Hello World         |
| 2  | Foo Bar             |
| 3  | Goodbye Cruel World |
+----+---------------------+
1 : Hello
2 : Foo
3 : Goodbye
我执行查询
从测试中选择id和value
。 如何使用
read
将每列分配给Bash中的变量

read-a
截断
值中第一个空格后的所有内容

mysql -D "jimmy" -NBe "SELECT id, value FROM test" | while read -a row;
do
    id="${row[0]}"
    value="${row[1]}"

    echo "$id : $value"
done;
输出如下所示:

+----+---------------------+
| id |     value           |
+----+---------------------+
| 1  | Hello World         |
| 2  | Foo Bar             |
| 3  | Goodbye Cruel World |
+----+---------------------+
1 : Hello
2 : Foo
3 : Goodbye
但我需要它看起来像:

1 : Hello World
2 : Foo Bar
3 : Goodbye Cruel World

我知道有一些参数可以传递给MySQL以表格式格式化结果,但我需要解析每行中的每个值。这只是我问题的一个简单例子

在中使用单个字段而不是数组:

mysql -D "jimmy" -NBe "SELECT id, value FROM test" | while read -r id value;
do
    echo "$id : $value"
done
这将确保
id
将被读入
id
字段,其他所有内容将被读入
value
字段-这就是
read
在输入的字段数大于读入的变量数时的行为。如果要读取更多的列,使用与实际数据不冲突的分隔符(如
@
)将有助于:

mysql -D "jimmy" -NBe "SELECT CONCAT(id, '@', value, '@', column3) FROM test" | while IFS='@' read -r id value column3;
do
    echo "$id : $value : $column3"
done

可以这样做,如果可能的话,还可以避免将命令管道化到while read循环,以避免创建子shell

while read -r line; do
    id=$(echo $line | awk '{print $1}')
    value=$(echo $line | awk '{print $1=""; print $0}'|sed ':a;N;$!ba;s/\n/ /g'| sed 's/^[ \t]*//g')
    echo "ID: $id"
    echo "VALUE: $value"
done< <(mysql -D "jimmy" -NBe "SELECT id, value FROM test")

我在使用以结尾的
字段时出现语法错误:
您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以了解在第1行“TERMINATED BY”(终止于)附近使用的正确语法。这仅在使用输出文件时有效吗?使用
CONCAT
而不是以
结尾的
字段-这应该有效。看起来后者只有在输出重定向到文件时才起作用。在这种情况下使用
CONCAT
是否会在
value
包含逗号时导致问题?您能解释一下为什么这样做吗?这是因为只有两个变量,并且第一个分隔符之后的所有内容都放在第二个分隔符中吗?还要注意,value在mysql中是一个关键字,所以必须在其周围使用转义字符,例如:从test中选择CONCAT(id,'@',value\'''''''@',column3)