免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13656 | 回复: 17
打印 上一主题 下一主题

[数值计算] 【难题】shell与mysql变量传递问题!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-03 20:43 |只看该作者 |倒序浏览
本帖最后由 chao1999 于 2013-02-03 21:07 编辑

编写了一个shell脚本来读取数据,然后插入数据并带循环的脚本,其内容如下:

  1. #!/bin/bash
  2. #USER=root        #设定用户名
  3. #PASSWORD="root"   #设定数据库的用户密码
  4. #DB=smsserver
  5. # 从数据库读取短信内容ss=$(mysql -uroot -proot -D smsserver -e "select content_sms from default_content where id=1;")
  6. echo $ss
  7. count=$(mysql -uroot -proot -D smsserver -e "select count(*) from sender;")
  8. echo $count
  9. for i in $count
  10. do

  11. sss=$(mysql -uroot -proot -D smsserver -e "select sender_number from sender where [b][color=RoyalBlue]id=$i[/color][/b];")
  12. echo $sss
  13. mysql -uroot -proot -D smsserver -e "insert into smsserver_out (type,recipient,text,encoding,create_date) values ('O','$sss','$ss','U',now());"
  14. echo $i
  15. done
复制代码
执行此shell脚本文件后,输出结果如下:

  1. content_sms 测试信息
  2. count(*) 2
  3. ERROR 1111 (HY000) at line 1: Invalid use of group function

  4. count(*)

  5. 2

复制代码
问题如下:
1、可能是语法不对shell读取变量总是有问题,结果总是不对。
2、echo打印时总是将字段的名字一起输出……
3、id=$变量系统总是不能正确读取开始的时候数据库用户名密码等都是用变量赋值,后来变量一直出问题就在语句里直接写入,
结果还是出问题,搞了一整天也还是没有搞定,真是郁闷!
请高手们出手帮忙啊!!



论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2013-02-03 21:16 |只看该作者
很明显你这个就是有问题的

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
3 [报告]
发表于 2013-02-03 21:29 |只看该作者
不知道怎么说,我猜测:

1. 你的需求是从 default_content  表中查出 content_sms的内容然后再一条条插入到 smsserver_out 表中。

2. 我不知道你查询 sender 表的总记录数是何意? 但你用一个固定的记录数值去做for循环怎么行呢?

3. 要想只得到数值赋给变量count,请使用 count=$(mysql -uroot -proot -D smsserver  -BN -e "select count(*) from sender;")


论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
4 [报告]
发表于 2013-02-03 22:08 |只看该作者
本帖最后由 关阴月飞 于 2013-02-03 23:56 编辑

回复 1# chao1999


mysql -e SQL语句输出,  都是带表头的, 需要把第一行过滤一下:
另外你insert 时, 用到了 MYSQL NOW()函数, 不知道需不需要加引号, 没环境测不了...
如果这些问题都解决了, 还不能insert, 那就得看你建表的时候, 表字段定义的数据类型是否正确...
  1. #!/bin/bash
  2. #USER=root        #设定用户名
  3. #PASSWORD="root"   #设定数据库的用户密码
  4. #DB=smsserver
  5. # 从数据库读取短信内容

  6. ss=$(mysql -uroot -proot -D smsserver -e "select content_sms from default_content where id=1" |awk 'NR>1')
  7. echo "$ss"

  8. count=$(mysql -uroot -proot -D smsserver -e "select count(*) from sender" |awk 'NR>1')
  9. echo $count

  10. for i in $count
  11. do
  12.         sss=$(mysql -uroot -proot -D smsserver -e "select sender_number from sender where id=$i" |awk 'NR>1')
  13.         echo $sss
  14.        
  15.         mysql -uroot -proot -D smsserver -e "insert into smsserver_out (type,recipient,text,encoding,create_date) values ('O','$sss','$ss','U',now());"
  16.         echo $i
  17. done
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-02-03 22:51 |只看该作者
reyleon 发表于 2013-02-03 21:29
不知道怎么说,我猜测:

1. 你的需求是从 default_content  表中查出 content_sms的内容然后再一条条插入 ...


谢谢你的回复你猜的基本正确!
我的需求是从 default_content  表中查出 content_sms字段id1的预设的要发送的短信内容,
然后再根据sender 表sender_number字段里所有的电话号码插入到 smsserver_out 表中去。
最终实现给多个电话号码同时发送一条短信。
查询 sender 表的总记录数就是先看看目前sender 表里有几个电话号码然后再做循环。

请帮忙给再指教下吧!

论坛徽章:
0
6 [报告]
发表于 2013-02-03 22:59 |只看该作者
本帖最后由 chao1999 于 2013-02-03 23:08 编辑
关阴月飞 发表于 2013-02-03 22:08
回复 1# chao1999

拷贝源码测试结果如下
请再多多指教谢谢啊!!
另外,insert 时, 用到了 MYSQL NOW()函数, 我这个环境不需要加引号的

  1. 短信测试信息
  2. 2
  3. /etc/sms01: 行 20: 寻找匹配的 `'' 是遇到了未预期的文件结束符
  4. /etc/sms01: 行 22: 语法错误: 未预期的文件结尾
复制代码
上面这个小错误找到原因了——是因为echo $i'多了'号,去掉就好了,输出如下:
  1. 短信测试信息!
  2. 2

  3. 2
复制代码
这个输出结果还是没有输出“sende”表中“sender_number”字段的2个电话号码






======================

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
7 [报告]
发表于 2013-02-03 23:19 |只看该作者
本帖最后由 关阴月飞 于 2013-02-03 23:28 编辑

回复 6# chao1999

求 “sende”表详细内容
贴一下在mysql命令行下的结果来看看:
  1. desc smsserver.sende;
  2. select * from smsserver.sende;
复制代码
另外,按你的意思是想根据 $count 的数量来做循环, 改一下for 的写法:
  1. for (( i=1; i<=$count; i++ ))
  2. do

  3. ...
  4. ...

  5. done
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-02-03 23:36 |只看该作者
本帖最后由 chao1999 于 2013-02-03 23:39 编辑
关阴月飞 发表于 2013-02-03 23:19
回复 6# chao1999

求 “sende”表详细内容


上面两条不知为何在mysql里都执行错误
  1. mysql> desc smsserver.sende;
  2. ERROR 1146 (42S02): Table 'smsserver.sende' doesn't exist
  3. mysql> select * from smsserver.sende;
  4. ERROR 1146 (42S02): Table 'smsserver.sende' doesn't exist
复制代码
另外贴2张表结构和数据的图片吧吧
那个“sender”表里id只有1和3没有2,会不会是与这个有关??

表数据

表结构

论坛徽章:
0
9 [报告]
发表于 2013-02-03 23:44 |只看该作者
本帖最后由 chao1999 于 2013-02-03 23:45 编辑

唉知道刚才为啥出错了,“sende”应该是“sender”
输出结果如下:

  1. mysql> desc smsserver.sender;
  2. +---------------+-------------+------+-----+---------+----------------+
  3. | Field         | Type        | Null | Key | Default | Extra          |
  4. +---------------+-------------+------+-----+---------+----------------+
  5. | id            | int(11)     | NO   | PRI | NULL    | auto_increment |
  6. | sender_number | varchar(11) | YES  |     | NULL    |                |
  7. | sender_name   | varchar(64) | YES  |     | NULL    |                |
  8. | sender_group  | varchar(64) | YES  |     | NULL    |                |
  9. | sender_hide   | varchar(1)  | YES  |     | 0       |                |
  10. +---------------+-------------+------+-----+---------+----------------+
  11. 5 rows in set (0.00 sec)

  12. mysql> select * from smsserver.sender;
  13. +----+---------------+-------------+--------------+-------------+
  14. | id | sender_number | sender_name | sender_group | sender_hide |
  15. +----+---------------+-------------+--------------+-------------+
  16. |  1 | 13899999999   | 管理员      | 中心     | 0           |
  17. |  3 | 13777777777   | 管理员2       | 中心     | 0           |
  18. +----+---------------+-------------+--------------+-------------+
  19. 2 rows in set (0.00 sec)
复制代码

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
10 [报告]
发表于 2013-02-03 23:50 |只看该作者
本帖最后由 关阴月飞 于 2013-02-03 23:53 编辑

回复 9# chao1999


明白了, 结合你的意思, 试试下面的能不能OK

  1. #!/bin/bash
  2. #USER=root        #设定用户名
  3. #PASSWORD="root"   #设定数据库的用户密码
  4. #DB=smsserver
  5. # 从数据库读取短信内容

  6. ss=$(mysql -uroot -proot -NB smsserver -e "select content_sms from default_content where id=1")
  7. echo "$ss"

  8. sss=$(mysql -uroot -proot -NB smsserver -e "select sender_number from sender")
  9. echo "$sss"

  10. for i in $sss
  11. do   
  12.     mysql -uroot -proot -D smsserver -e "insert into smsserver_out (type,recipient,text,encoding,create_date) values ('O','$i','$ss','U',now())"
  13.     echo $i
  14. done
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP