免费注册 查看新帖 |

Chinaunix

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

shell脚本实现股票查询 [复制链接]

论坛徽章:
0
发表于 2012-02-28 13:17 |显示全部楼层
本帖最后由 g84ch 于 2012-02-28 14:43 编辑

    博客地址:http://blog.chinaunix.net/uid-18757596-id-3085105.html
    偶然在网上看到sina有一个查询股票信息的api,随即在linux下用shell写了个小脚本查询股票信息,方便工作之余关心一下股票行情,而且在linux终端里面查看,不容易被boss发现哦(我还故意把字体颜色调成了深蓝色,不仔细看,看不出来的哦,boss同事还以为你在认真工作写代码呢,嘿嘿)。小脚本分两个部分,checkstock.sh和stock_num.dat,把想要查询的股票代码(格式为:sh601699 或者 sz000001)添加到stock_num.dat中去,运行checkstock.sh即可查询。
    顺便总结一下,写脚本时候碰到的一些问题和解决方法,以备日后查阅,也望各位大牛指点新招妙招:
1. 浮点数的比较:
    两种方法:1. ds=`echo "1.23" "2.33" | awk '{if($1>=$2) {print 1;} else {print 0;}}'`
                               2. ds=`echo "$1 >= $2" | bc`
    因为test只能比较整数,浮点数的比较借用了bc和awk,通过上述两句,ds的值为0或者1,再做判断。

2. 数组作为参数传给函数:
    见函数prase_info()中的第一句, 如下:
     eval $(echo $1 | awk '{split($0,array,","; for(i in array) print "hs_info_array["i"]="array}')
通过这个语句,可以把参数$1(字符串数组)通过awk赋给shell数组hs_info_array 。

3. 传参数不改变字符数组的结构
    见函数print_array(),传值的时候用 print_array "${STOCK_NUM[@]}",这里用@,结构不变,用*,则数组中的字符串则会被拆分,比如,STOCK_NUM[1]="aaa   bbb" 如果传值时用*,则会被分成两个,一个是aaa,一个是bbb。而用@,则仍然是“aaa   bbb”

配置文件stock_num.dat如下:
  1.     sh601699
  2.     sh600600
  3.     sz000002
复制代码
shell脚本checkstock.sh如下:
  1.     #!/bin/bash

  2.     ##################################################################################
  3.     # Read stock number data from ./stock_num_file.txt
  4.     #
  5.     #
  6.     #
  7.     ###################################################################################
  8.     STOCK_NUM_FILE="./stock_num.dat"
  9.     ITEM_COLOR="\033[34m"
  10.     COLOR_RESET="\033[0m"
  11.     COLOR_RED="\033[31m"
  12.     COLOR_GREEN="\033[32m"

  13.     function ERRTRAP()
  14.     {
  15.             echo "[LINE:$1] Error: Comand or Function exited with status $?"

  16.     }

  17.     function print_array()
  18.     {
  19.             i=0
  20.             for elem in "$@"
  21.             do
  22.                     echo $((i++)) $elem
  23.             done
  24.     }

  25.     function read_data_file()
  26.     {
  27.             i=0
  28.             if [ ! -e "./stock_num.dat" ]
  29.             then
  30.                     echo "ERROR: The stock_num.dat isn't existed!"
  31.                     exit 0
  32.             fi

  33.             while read line
  34.             do
  35.                     STOCK_NUM[$i]=$line
  36.                     let i+=1
  37.             done < $STOCK_NUM_FILE
  38.             for ((i=0; i < ${#STOCK_NUM[@]}; i++ ))
  39.             do
  40.             #echo "${STOCK_NUM[$i]}"
  41.                     get_info ${STOCK_NUM[$i]}
  42.             done
  43.     }

  44.     ############################################################################
  45.     #
  46.     # funciton: get_info(arg1)
  47.     #
  48.     # result: Get stock information from Internet
  49.     #
  50.     ############################################################################
  51.     function get_info()
  52.     {
  53.             stock_info=`curl http://hq.sinajs.cn/list=$1 2>/dev/null | sed -n -e 's/var.*=\"//' -e 's/ //g' -e 's/\";$//p'`
  54.     # echo "$stock_info"
  55.     # s_name=`echo "$stock_info" | sed -n 's/,.*$//p'`
  56.     # echo $s_name
  57.     # stock_data=`echo "$stock_info" | sed -n 's/'$s_name',//p'`
  58.     # echo $stock_data
  59.             s_num=$1
  60.             if [ "$stock_info" != "" ];then
  61.                     prase_info $stock_info
  62.                     display_info
  63.             else
  64.                     echo "Exception:Can't find any infomation about $s_num"
  65.             fi
  66.     }

  67.     function prase_info()
  68.     {
  69.             eval $(echo $1 | awk '{split($0,array,","); for(i in array) print "stock_info_array["i"]="array[i]}')
  70.             s_name=${stock_info_array[1]}
  71.             s_today_open=${stock_info_array[2]}
  72.             s_lastday_close=${stock_info_array[3]}
  73.             s_current_price=${stock_info_array[4]}
  74.             s_today_highest=${stock_info_array[5]}
  75.             s_today_lowest=${stock_info_array[6]}
  76.             s_dealed_stock_num=${stock_info_array[9]}
  77.             s_dealed_stock_cash_num=${stock_info_array[10]}
  78.             s_date=${stock_info_array[31]}
  79.             s_time=${stock_info_array[32]}

  80.             #####################################
  81.             #${stock_info_array[11-20] buy1-buy5
  82.             #${stock_info_array[21-30] sale1-sale5
  83.             ######################################


  84.     }

  85.     ############################################################################
  86.     #
  87.     # funciton: print_pre_zero(arg1)
  88.     #
  89.     # result: add prefix zero for rate
  90.     #
  91.     ############################################################################
  92.     function print_pre_zero()
  93.     {
  94.             local cmp_value_1=`echo "$1 < 0 && $1 > -1" | bc`
  95.             local cmp_value_2=`echo "$1 >0 && $1 < 1" | bc`
  96.             if [ $cmp_value_1 -eq "1" ]
  97.             then
  98.                     local tmp_val=`echo "scale=2;$1 / -1" | bc -l`
  99.                     echo "-0$tmp_val"
  100.             elif [ $cmp_value_2 -eq "1" ]
  101.             then
  102.                     echo "0$1"
  103.             else
  104.                     echo "$1"
  105.             fi

  106.     }

  107.     ############################################################################
  108.     #
  109.     # funciton: cmp_display(arg1,arg2)
  110.     #
  111.     # result: print arg1 with color(red or green)
  112.     #
  113.     ############################################################################
  114.     function cmp_display()
  115.     {
  116.     #############################################################################
  117.     # Two methods to compare float:
  118.     # 1. ds=`echo "0" "0" | awk '{if($1>=$2) {print 1;} else {print 0;}}'`
  119.     # 2. ds=`echo "$1 >= $2" | bc`
  120.     # echo $ds
  121.     #############################################################################
  122.             local cmp_value=`echo "$1 >= $2" | bc -l`
  123.             if [ $cmp_value -eq "0" ]
  124.             then
  125.                     echo -e "$COLOR_GREEN $1 $COLOR_RESET"
  126.             else
  127.                     echo -e "$COLOR_RED $1 $COLOR_RESET"
  128.             fi
  129.     }


  130.     ############################################################################
  131.     #
  132.     # funciton: cmp_display_rate(arg1,arg2)
  133.     #
  134.     # result: print arg1 with color(red or green) and add prefix zero.
  135.     #
  136.     ############################################################################
  137.     function cmp_display_rate()
  138.     {
  139.             local tmp_rate=`echo "($1 - $2) / $2 * 100" | bc -l`
  140.             local cmp_rate=`echo "scale=2;$tmp_rate/1" | bc`

  141.             local cmp_value=`echo "$1 >= $2" | bc`

  142.             if [ $cmp_value -eq "0" ]
  143.             then
  144.                     echo -e "$COLOR_GREEN $1 ($(print_pre_zero $(echo $1 - $2 | bc -l)) $(print_pre_zero $cmp_rate)%)$COLOR_RESET"
  145.             else
  146.                     echo -e "$COLOR_RED $1 (+$(print_pre_zero $(echo $1 - $2 | bc -l)) $(print_pre_zero $cmp_rate)%)$COLOR_RESET"
  147.             fi


  148.     }

  149.     function display_info()
  150.     {
  151.             echo -e "$s_date"
  152.             echo -e "$s_time"
  153.             echo -e "$ITEM_COLOR STOCK: $s_name No. $s_num $COLOR_RESET"
  154.             echo -e "$ITEM_COLOR Last Day Closed Price:$COLOR_RESET $s_lastday_close"
  155.             echo -e "$ITEM_COLOR Today Open Price:$COLOR_RESET $(cmp_display $s_today_open $s_lastday_close)"
  156.             echo -e "$ITEM_COLOR Curren Price:$COLOR_RESET $(cmp_display_rate $s_current_price $s_lastday_close)"
  157.             echo -e "$ITEM_COLOR Highest Price:$COLOR_RESET $(cmp_display $s_today_highest $s_lastday_close)"
  158.             echo -e "$ITEM_COLOR Lowest Price:$COLOR_RESET $(cmp_display $s_today_lowest $s_lastday_close)"
  159.             echo -e "$ITEM_COLOR Dealed Stock Num(per 100):$COLOR_RESET $(expr $s_dealed_stock_num / 100)"
  160.             echo -e "$ITEM_COLOR Dealed Stock Cash Num:$COLOR_RESET $s_dealed_stock_cash_num"
  161.     }

  162.     function display_hs_index()
  163.     {
  164.             eval $(echo $1 | awk '{split($0,array,","); for(i in array) print "hs_info_array["i"]="array[i]}')
  165.             echo -e "$ITEM_COLOR Index:$COLOR_RESET ${hs_info_array[1]}$COLOR_RESET"
  166.             echo -e "$ITEM_COLOR Today Open:$COLOR_RESET $(cmp_display ${hs_info_array[2]} ${hs_info_array[3]})"
  167.             echo -e "$ITEM_COLOR Last CLosed:$COLOR_RESET ${hs_info_array[3]}"
  168.             echo -e "$ITEM_COLOR Curren :$COLOR_RESET $(cmp_display_rate ${hs_info_array[4]} ${hs_info_array[3]})"
  169.             echo -e "$ITEM_COLOR Highest:$COLOR_RESET $(cmp_display ${hs_info_array[5]} ${hs_info_array[3]})"
  170.             echo -e "$ITEM_COLOR Lowest:$COLOR_RESET $(cmp_display ${hs_info_array[6]} ${hs_info_array[3]})"



  171.     }

  172.     function view_hs_index()
  173.     {
  174.             sh_info=`curl http://hq.sinajs.cn/list=sh000001 2>/dev/null | sed -n -e 's/var.*=\"//' -e 's/\";$//p'`
  175.             if [ "$sh_info" != "" ];then
  176.                     display_hs_index $sh_info
  177.             else
  178.                     echo "Exception:Can't find any infomation about $s_num"
  179.             fi
  180.             sz_info=`curl http://hq.sinajs.cn/list=sz399001 2>/dev/null | sed -n -e 's/var.*=\"//' -e 's/\";$//p'`
  181.             if [ "$sz_info" != "" ];then
  182.                     display_hs_index $sz_info
  183.             else
  184.                     echo "Exception:Can't find any infomation about $s_num"
  185.             fi

  186.     }

  187.     view_hs_index
  188.     read_data_file
  189.     #trap "ERRTRAP $LINENO" ERR
复制代码

论坛徽章:
0
发表于 2012-03-01 09:18 |显示全部楼层
太帅了 学习了

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2012-03-01 09:31 |显示全部楼层
学以致用,很好!

论坛徽章:
0
发表于 2012-03-01 09:34 |显示全部楼层
谢谢分享,膜拜!

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2012-03-01 10:01 |显示全部楼层
不错, 慢慢看。

这行:
  1. stock_info=`curl http://hq.sinajs.cn/list=$1 2>/dev/null | sed -n -e 's/var.*=\"//' -e 's/ //g' -e 's/\";$//p'`
复制代码
是否直接可以:
  1. stock_info=`curl http://hq.sinajs.cn/list=$1 2>/dev/null | cut -d \" -f2`
复制代码
或者
  1. stock_info=`curl http://hq.sinajs.cn/list=$1 2>/dev/null | awk -F \" '{gsub(/ /,"",$2);print $2}' `
复制代码

论坛徽章:
0
发表于 2012-03-01 10:31 |显示全部楼层
多谢版主指教,学习了。呵呵

回复 5# rdcwayx


   

论坛徽章:
71
15-16赛季CBA联赛之同曦
日期:2018-08-23 15:41:42辰龙
日期:2014-08-15 09:07:43狮子座
日期:2014-06-03 13:55:33亥猪
日期:2014-06-02 11:17:08巨蟹座
日期:2014-05-06 10:02:03午马
日期:2014-05-04 08:18:27亥猪
日期:2014-04-29 11:11:32技术图书徽章
日期:2014-04-24 15:51:26技术图书徽章
日期:2014-04-17 11:01:53辰龙
日期:2014-04-15 12:45:46亥猪
日期:2014-04-11 09:06:23射手座
日期:2014-04-01 15:28:10
发表于 2012-03-01 10:35 |显示全部楼层
$ ./checkstock.sh
Exception:Can't find any infomation about
Exception:Can't find any infomation about
Exception:Can't find any infomation about sh601699
Exception:Can't find any infomation about sh600600
Exception:Can't find any infomation about sz000002

论坛徽章:
0
发表于 2012-03-01 10:48 |显示全部楼层
回复 6# g84ch

或者直接 awk 'BEGIN{"curl http://hq.sinajs.cn/list='$1' 2>/dev/null"|getline;print $2}'


   

论坛徽章:
0
发表于 2012-03-01 10:49 |显示全部楼层
回复 7# zhaopingzi


#./checkstock.sh
Index: 上证指数
Today Open:  2418.788
Last CLosed: 2428.487
Curren :  2424.853 (-3.634 -0.14%)
Highest:  2434.691
Lowest:  2418.334
Index: 深证成指
Today Open:  10011.119
Last CLosed: 10054.845
Curren :  10068.840 (+13.995 0.13%)
Highest:  10123.275
Lowest:  10011.119
2012-03-01
10:48:25
STOCK: 潞安环能 No. sh601699
Last Day Closed Price: 26.70
Today Open Price:  26.51
Curren Price:  27.12 (+0.42 1.57%)
Highest Price:  27.12
Lowest Price:  26.42
Dealed Stock Num(per 100): 47937
Dealed Stock Cash Num: 128807467
2012-03-01
10:48:28
STOCK: 柳工 No. sz000528
Last Day Closed Price: 14.20
Today Open Price:  14.15
Curren Price:  14.25 (+0.05 0.35%)
Highest Price:  14.35
Lowest Price:  14.14
Dealed Stock Num(per 100): 39039
Dealed Stock Cash Num: 55662717.84
2012-03-01
10:48:25
STOCK: 青岛啤酒 No. sh600600
Last Day Closed Price: 33.90
Today Open Price:  33.73
Curren Price:  33.93 (+0.03 0.08%)
Highest Price:  34.00
Lowest Price:  33.73
Dealed Stock Num(per 100): 3463
Dealed Stock Cash Num: 11707678
2012-03-01
10:48:28
STOCK: 万科A No. sz000002
Last Day Closed Price: 8.28
Today Open Price:  8.24
Curren Price:  8.40 (+0.12 1.44%)
Highest Price:  8.47
Lowest Price:  8.22
Dealed Stock Num(per 100): 368564
Dealed Stock Cash Num: 309623305.93

论坛徽章:
0
发表于 2012-03-01 10:55 |显示全部楼层
回复 8# jiejie455

貌似不行啊
  1. awk 'BEGIN{"curl http://hq.sinajs.cn/list=sh601699 2>/dev/null"|getline;print $2}'
  2. hq_str_sh601699="潞安环能,26.51,26.70,26.99,27.13,26.42,26.98,26.99,5119704,137629495,100,26.98,100,26.97,14200,26.96,1600,26.94,200,26.93,100,26.99,13960,27.00,1900,27.01,4500,27.02,14200,27.03,2012-03-01,10:54:00";
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP