shell批量curl接⼝脚本的简单实现⽅法
前⾔
相信⼤家应该都有所体会,shell脚本可以说作⽤⾮常⼤,在服务器领域,⽤shell操作事务可⽐⼿动点击要⽅便快捷得多了。虽然只是⽂字界⾯,但是其强⼤的处理功能,会让各种操作超乎想象。⽽且,也可以将这些习惯移植到⽇常的⼯作当中,提升办事效率。
其实shell语法很简单,基本上就是综合⼀下在命令⾏下,⼀个个的命令集合,然后就组成了shell脚本。当然了,不懂语法的,百度搜索⼀下就好了嘛,毕竟,重要的是思想⽽⾮语法。
最近,刚接⼀需求,如下:
DBA会将⼀些服务规则的数据导出,然后⼀条条⼿动去curl某应⽤接⼝,从⽽完成相应的业务要求。
那么问题来了,DBA导出的数据是格式化的,要curl的接⼝也是格式化的,需要的,只是将相应的数据替换成对应的值即可。注意,不保证所有的命令都能执⾏成功,有可能需要重新跑接⼝。
很明显,⼿动⼀条条地去写curl命令,然后⼀条条执⾏,然后观察结果,做出判断,这对于少数⼏个数据来说,是可⾏的。但是假设,数据有⼏百条、⼏千条⼏万条呢,那就不可能⼈⼯⼀条条去搞了吧。因此,
shell脚本就该出场了(当然了,有同学说,我⽤其他语⾔也可以啊,甚⾄说我这个功能写到代码⾥就可以了,然⽽这些特殊⽆意义的代码,是不需要长期保留下来的)。
该shell脚本只要做好三件事就⾏了:
  1. 读取源数据⽂件的内容,替换接⼝的数据格式;
  2. 执⾏命令,完成业务操作;
  3. 记录完整的⽇志,以便后期排查对⽐;
需求很简单,不懂语法没关系,查⼀下嘛。参考代码如下:
#!/bin/bash
log_file='result.log'
param_file=$1  # 源数据在命令⾏中指定
log_cmd="tee -a $log_file"
i=1
for line in `cat $param_file`;
do
echo "read line" $i ":" $line | tee -a $log_file
let "i=$i+1"
OLD_IFS=$IFS;IFS=",";
arr=($line)            # 分割数据到数组
IFS=$OLD_IFS;
curl_cmd="curl -d 'uId=${arr[0]}&bid=${arr[1]}&bA=${arr[2]}&to=6&bP=30&fddays=5' localhost:8080/mi/api/ss/1.0.1/co/apply"
echo `date "+%Y-%m-%d %H:%M:%S"` "start ===>> " $curl_cmd | tee -a $log_file
eval "$curl_cmd 2>&1" | tee -a $log_file     # 使⽤ eval 命令,把错误⽇志和接⼝返回结果⼀并带回,到后续console及⽇志存储
echo `date "+%Y-%m-%d %H:%M:%S"` "end <<===" $curl_cmd | tee -a $log_file
done
shell最简单脚本echo `date "+%Y-%m-%d %H:%M:%S"` "over: end of shell" | tee -a $log_file
源数据格式参考如下:
234,201708222394083443,5000
4211,201782937493274932,3000
23,201749379583475934,2000
当读取的⽂件格式为空格分隔的⽂件时,该读取将发⽣异常,换成另⼀种⽅式读取⾏:
#!/bin/bash
log_file='result.log'
param_file=$1
log_cmd="tee -a $log_file"
i=1
while read line;
do
echo "read line" $i ":" $line | tee -a $log_file
let "i=$i+1"
arr=($line)
curl_cmd="curl -d 'uId=${arr[0]}&bid=${arr[1]}&bt=${arr[2]}&toBorrowType=6&borrowPeriod=30&fddays=5' localhost/mi/c/1.0.1/c/n"
echo `date "+%Y-%m-%d %H:%M:%S"` "start ===>> " $curl_cmd | tee -a $log_file
#`$curl_cmd` 2>&1 $log_file | tee -a $log_file
eval "$curl_cmd 2>&1" | tee -a $log_file
echo `date "+%Y-%m-%d %H:%M:%S"` "end <<===" $curl_cmd | tee -a $log_file
done < $param_file
echo `date "+%Y-%m-%d %H:%M:%S"` "over: end of shell" | tee -a $log_file
这⾥有个技巧,即使⽤tee命令,既在console上显⽰了访问⽇志,也往⽂件⾥写⼊了记录。即有⼈⼯观察,也有⽇志存储,以备查看。
如此,便实现了⼤家都不⽤⼿动敲数据,从⽽在这上⾯犯错的可能了。 DBA从数据导出格式化数据,shell脚本直接读取格式化数据,保留记录。这才是程序该⼲的事。
⼀句话,想办法偷个懒,这是我们该⼲的事。
但是应该要注意,当⼀个接⼝被脚本跑去执⾏时,你就⾏考虑并发问题,以服务器的压问题了,也不要太相信代码。做最坏的打算。
总结
从前觉得1、2G的⽇志⽂件处理是个头疼的问题,后来发现 grep, awk, sed, less, salt 等⼯具组合起来,能让你从⼏⼗G甚⾄更多的千军万马⽂件中,直取要害。这便是linux的厉害之处。
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。