脚本如下:
#!/bin/bash mysql -s -phello test >1.log <<EOF desc t1; EOF lines="concat_ws(','," count=`cat 1.log|wc -l` linenum=0 while read line do coloumname=`echo $line |awk '{print $1}'` let linenum=linenum+1 if [ $linenum -eq 1 ];then lines=$lines"concat_ws(':','{"'"'$coloumname'"'"',if("$coloumname" is null or $coloumname='','null',concat('"'"'"',$coloumname,'"'"'"')))" elif [ $linenum -eq $count ];then lines=$lines",concat_ws(':','"'"'$coloumname'"'"',if("$coloumname" is null or $coloumname='','null}',concat('"'"'"',$coloumname,'"'"'"}'))))" else lines=$lines",concat_ws(':','"'"'$coloumname'"'"',if("$coloumname" is null or $coloumname='','null',concat('"'"'"',$coloumname,'"'"'"')))" fi done < 1.log echo $lines
表t1中的数据如下:
mysql> select * from t1; +------+-------+ | id | name | +------+-------+ | 1 | | | 1 | NULL | | 2 | hello | +------+-------+ 3 rows in set (0.00 sec)
脚本执行的结果如下:
concat_ws(',',concat_ws(':','{"id"',if(id is null or id='','null',concat('"',id,'"'))),concat_ws(':','"name"',if(name is null or name='','null}',concat('"',name,'"}'))))
在MySQL中执行的结果如下:
mysql> select concat_ws(',',concat_ws(':','{"id"',if(id is null or id='','null',concat('"',id,'"'))),concat_ws(':','"name"',if(name is null or name='','null}',concat('"',name,'"}')))) json_format from t1; +---------------------------+ | json_format | +---------------------------+ | {"id":"1","name":null} | | {"id":"1","name":null} | | {"id":"2","name":"hello"} | +---------------------------+ 3 rows in set (0.00 sec)
技巧:关于shell脚本中单引号和双引号的区别
shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。
单引号用于保持引号内所有字符的字面值,即使引号内的和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。
双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
-
$加变量名可以取变量的值
-
反引号仍表示命令替换
-
$表示$的字面值
-
\`表示`的字面值
-
"表示"的字面值
-
\表示的字面值
-
除以上情况之外,在其它字符前面的无特殊含义,只表示字面值。